如何使NSPopover正确地按照鼠标指针并忽略鼠标事件?
问题描述:
我想显示跟踪用户鼠标光标的信息NSPopover
。如何使NSPopover正确地按照鼠标指针并忽略鼠标事件?
为此,每当mouseMoved
事件触发时,我使用NSTrackingArea
更新弹出框的positioningRect
。
然而,这具有两个缺点:
- 的酥料饼如下具有稍微延迟的鼠标。我怎样才能减少这种延迟,使弹出窗口显得更加“粘”在鼠标指针上?
- 当我在弹窗的方向上移动鼠标指针时,会调用跟踪区域的
mouseExited
方法,这会导致弹出窗口“吸收”鼠标移动事件,以便跟踪区域的mouseMoved
事件不再触发。我该如何避免吸收鼠标事件的弹出窗口,或者至少继续转发这些事件?
这个问题是非常相似Any way around this NSTrackingArea quirk?,与我使用NSPopover
的区别,所以我没有什么要设置ignoresMouseEvents
上。
答
我看了一下你的问题。我无法消除滞后,但如果将popover.animates
设置为false
,则可能会减少。
错误的做法:
我能够通过添加新的边界(无影)window
在另一个之上,解决了mouseExited
超过popover
问题。将trackingArea
添加到透明窗口,将弹出窗口添加到原始窗口。根据透明窗口level
,它位于弹出窗口之上,因此它们不能相互干扰。 在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
之后被示出。
我已经在使用'popover'。animates = false“,但延迟仍然很明显: - /我也只是通过popover.contentViewController?.view.window?.setFrameOrigin()直接尝试了popover的起源,但这也没有帮助,所以我猜没有解决方案。 'ignoresMouseEvents = true'可以正常工作,谢谢! – MrMage
@MrMage你应该奖励给我mangerlahn赏金:) – manniL