如何使NSPopover正确地按照鼠标指针并忽略鼠标事件?

时间:2016-11-04 17:19:24

标签: macos cocoa nswindow appkit nspopover

我想显示跟踪用户鼠标光标的信息NSPopover

为此,只要NSTrackingArea事件触发,我就会使用positioningRect来更新popover的mouseMoved

然而,这有两个缺点:

  1. popover跟随鼠标稍稍延迟。如何减少此延迟以使弹出窗口更加“粘在”鼠标指针上?
  2. 当我沿着弹出框的方向移动鼠标指针时,会调用跟踪区域的mouseExited方法,这会导致弹出窗口“吸收”鼠标移动事件,以便跟踪区域的{{1}事件不再发生。如何避免弹出窗口吸收鼠标事件,或者至少继续转发这些事件?
  3. 此问题与Any way around this NSTrackingArea quirk?非常相似,区别在于我使用mouseMoved,因此我无需设置NSPopover

1 个答案:

答案 0 :(得分:2)

我看了你的问题。我无法消除延迟,但如果您将let filteredSubitems = productDict.filter{ $0["groupid"] as!String != "1" } 设置为popover.animates,则可能会减少延迟。

错误的做法

我能够通过在另一个上添加新边框(和无影子)false来解决mouseExited超过popover问题。 window被添加到透明窗口,弹出窗口被添加到原始窗口。根据透明窗口trackingArea,它位于弹出窗口上方,因此它们不会相互干扰。 在下面的gif中,您可以看到我的测试结果:

example 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