2016-11-04 52 views
5

我想顯示跟蹤用戶鼠標光標的信息NSPopover如何使NSPopover正確地按照鼠標指針並忽略鼠標事件?

爲此,每當mouseMoved事件觸發時,我使用NSTrackingArea更新彈出框的positioningRect

然而,這具有兩個缺點:

  1. 的酥料餅如下具有稍微延遲的鼠標。我怎樣才能減少這種延遲,使彈出窗口顯得更加「粘」在鼠標指針上?
  2. 當我在彈窗的方向上移動鼠標指針時,會調用跟蹤區域的mouseExited方法,這會導致彈出窗口「吸收」鼠標移動事件,以便跟蹤區域的mouseMoved事件不再觸發。我該如何避免吸收鼠標事件的彈出窗口,或者至少繼續轉發這些事件?

這個問題是非常相似Any way around this NSTrackingArea quirk?,與我使用NSPopover的區別,所以我沒有什麼要設置ignoresMouseEvents上。

回答

2

我看了一下你的問題。我無法消除滯後,但如果將popover.animates設置爲false,則可能會減少。

錯誤的做法

我能夠通過添加新的邊界(無影)window在另一個之上,解決了mouseExited超過popover問題。將trackingArea添加到透明窗口,將彈出窗口添加到原始窗口。根據透明窗口level,它位於彈出窗口之上,因此它們不能相互干擾。 在GIF下面你可以看到我的測試結果:

example gif

下面是我的一些代碼:

鼠標跟蹤:

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 
} 

自定義窗口:

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

Update 11/11/2016

我剛剛在您提供的鏈接中閱讀了該問題。有一個窗口可以設置ignoresMouseEvents。儘管NSPopover繼承自NSObject,但您有一個contentViewController,該對象包含一個view對象,該對象包含彈出0123,。 (如所解釋here

所以只需設置

popover.contentViewController?.view.window?.ignoresMouseEvents = true 

popover之後被示出。

+0

我已經在使用'popover'。animates = false「,但延遲仍然很明顯: - /我也只是通過popover.contentViewController?.view.window?.setFrameOrigin()直接嘗試了popover的起源,但這也沒有幫助,所以我猜沒有解決方案。 'ignoresMouseEvents = true'可以正常工作,謝謝! – MrMage

+0

@MrMage你應該獎勵給我mangerlahn賞金:) – manniL