2016-11-04 93 views
5

Kullanıcının fare imlecini izleyen bir NSPopover bilgilendirici görüntülemek istiyorum.NSPopover, fare işaretçisini düzgün bir şekilde nasıl izler ve fare olaylarını yoksayar?

Bunun için,olayları her açıldığında, positioningRect numaralı populasyonu güncellemek için NSTrackingArea kullanıyorum.

  1. popover küçük bir gecikme ile fareyi izler:

    Ancak bu iki dezavantajları vardır. Pop-up'ların fare imlecine daha "yapışmış" görünmesini sağlamak için bu gecikmeyi nasıl azaltabilirim?

  2. Fare işaretçisini popover yönünde hareket ettirdiğimde, izleme alanının mouseExited yöntemi çağrılıyor, bu da popover'ın fare hareketi olaylarını "absorbe etmesine" neden oluyor ve böylece izleme alanının mouseMoved olayının artık tetiklenmiyor. Fare olaylarını emen popülasyondan nasıl kaçınabilirim ya da en azından bu olayları iletmeye devam edebilir miyim?

Bu soru ben NSPopover kullanıyorum ayrım ile, Any way around this NSTrackingArea quirk? çok benzer, bu yüzden üzerinde ignoresMouseEvents ayarlamak hiçbir şey yok.

cevap

2

Sorununuza bir göz attım. Gecikmeyi ortadan kaldıramadım, ancak popover.animates değerini false olarak ayarlarsanız bu durum azalabilir.

Yanlış yaklaşım:

Ben diğerinin üstüne yeni sınır (ve gölgesiz) window ekleyerek mouseExitedpopover üzerinde sorunu çözmek başardı. trackingArea şeffaf pencereye, orijinali olan popover'e eklenir. Saydam pencerelere bağlı olarak level, popoverin üstündedir ve bu nedenle birbirleriyle etkileşime giremezler. gif olarak sen benim testlerin sonuçlarını görebiliriz:

fare izleme:

override func mouseMoved(with event: NSEvent) { 
    let location = self.view.convert(event.locationInWindow, from: nil) 
    popover.positioningRect.origin.x = location.x 
    popover.positioningRect.origin.y = location.y 
} 

özel penceresi:

İşte example gif

kodumu bazıları ise

transparentWindow.backgroundColor = NSColor.clear 
transparentWindow.isOpaque = false 
transparentWindow.styleMask = .borderless 
transparentWindow.makeKeyAndOrderFront(nil) 

Güncelleme 11/11/2016:

Sadece sağladığınız bağlantıdaki sorumu okudum. ignoresMouseEvents'u ayarlamak için bir pencere var. NSPopover, NSObject öğesinden devralmasına rağmen, contentViewController (view) nesnesine sahip olmanıza rağmen, window popolarını tutan nesneye sahiptir.

Yani basitçe gösterilmiştir popover sonra
popover.contentViewController?.view.window?.ignoresMouseEvents = true 

set (olarak here açıklanmıştır).

+0

Zaten "popover" kullanıyordum.animates = false', ancak gecikme hala farkedilebilir: -/Ayrıca popover'ın kökeni doğrudan popover.contentViewController? .view.window? .setFrameOrigin() ile çalıştı, ama bu da işe yaramadı. Sadece bunun için bir çözüm yok. 'IgnoresMouseEvents = true' iyi çalışıyor, teşekkürler! – MrMage

+0

@MrMage Sanırım mangerlahn'a ödül vermelisiniz :) – manniL