macos – 如何使NSPopover正确地跟随鼠标指针并忽略鼠标事件?

macos – 如何使NSPopover正确地跟随鼠标指针并忽略鼠标事件?,第1张

概述我想显示一个跟踪用户鼠标光标的信息NSPopover. 为此,每当mouseMoved事件触发时,我都会使用NSTrackingArea来更新popover的locateRect. 但是,这有两个缺点: > popover跟随鼠标略有延迟.如何减少此延迟以使d出窗口更加“粘在”鼠标指针上? >当我沿着d出方向移动鼠标指针时,会调用跟踪区域的mouseExited方法,这会导致d出窗口“吸收”鼠标移 我想显示一个跟踪用户鼠标光标的信息NSPopover.

为此,每当mouseMoved事件触发时,我都会使用NSTrackingArea来更新popover的locateRect.

但是,这有两个缺点:

> popover跟随鼠标略有延迟.如何减少此延迟以使d出窗口更加“粘在”鼠标指针上?
>当我沿着d出方向移动鼠标指针时,会调用跟踪区域的mouseExited方法,这会导致d出窗口“吸收”鼠标移动事件,从而不再触发跟踪区域的mouseMoved事件.如何避免d出窗口吸收鼠标事件,或者至少保持转发这些事件?

这个问题与Any way around this NSTrackingArea quirk?非常相似,区别在于我正在使用NSPopover,所以我没有设置ignoresMouseEvents.

解决方法 我看了看你的问题.我无法消除延迟,但如果将popover.animates设置为false,则可能会减少.

错误的做法:

通过在另一个上面添加一个新的边框(和无阴影)窗口,我能够解决mouseExited over popover问题. trackingArea被添加到透明窗口,popover到原始窗口.根据透明的窗户水平,它位于d出窗口之上,因此它们不会相互干扰.
在下面的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.cleartransparentWindow.isOpaque = falsetransparentWindow.styleMask = .@[email protected](nil)

2016年11月11日更新:

我刚刚在您提供的链接中阅读了该问题.有一个窗口可以设置ignoresMouseEvents.即使NSPopover继承自NSObject,你也有一个contentVIEwController,它包含一个视图对象,它保存着d出窗口. (如here所述)

所以简单地设置

popover.contentVIEwController?.vIEw.window?.ignoresMouseEvents = true

d出窗口后显示.

总结

以上是内存溢出为你收集整理的macos – 如何使NSPopover正确地跟随鼠标指针并忽略鼠标事件?全部内容,希望文章能够帮你解决macos – 如何使NSPopover正确地跟随鼠标指针并忽略鼠标事件?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1011600.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存