我想显示跟踪用户鼠标光标的信息NSPopover
。
为此,只要NSTrackingArea
事件触发,我就会使用positioningRect
来更新popover的mouseMoved
。
然而,这有两个缺点:
mouseExited
方法,这会导致弹出窗口“吸收”鼠标移动事件,以便跟踪区域的{{1}事件不再发生。如何避免弹出窗口吸收鼠标事件,或者至少继续转发这些事件?此问题与Any way around this NSTrackingArea quirk?非常相似,区别在于我使用mouseMoved
,因此我无需设置NSPopover
。
答案 0 :(得分:2)
我看了你的问题。我无法消除延迟,但如果您将let filteredSubitems = productDict.filter{
$0["groupid"] as!String != "1"
}
设置为popover.animates
,则可能会减少延迟。
错误的做法:
我能够通过在另一个上添加新边框(和无影子)false
来解决mouseExited
超过popover
问题。 window
被添加到透明窗口,弹出窗口被添加到原始窗口。根据透明窗口trackingArea
,它位于弹出窗口上方,因此它们不会相互干扰。
在下面的gif中,您可以看到我的测试结果:
以下是我的一些代码:
鼠标跟踪:
level
自定义窗口:
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
}
2016年11月11日更新:
我刚刚在您提供的链接中阅读了该问题。有一个窗口可以设置transparentWindow.backgroundColor = NSColor.clear
transparentWindow.isOpaque = false
transparentWindow.styleMask = .borderless
transparentWindow.makeKeyAndOrderFront(nil)
。即使ignoresMouseEvents
继承自NSPopover
,您也会拥有NSObject
,其中包含一个contentViewController
对象,该对象包含popovers view
。 (正如here所述)
所以只需设置
即可window
显示popover.contentViewController?.view.window?.ignoresMouseEvents = true
后。