2016-11-04 57 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