为此,每当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 = .@R_403_5559@lesstransparentWindow.makeKeyAndOrderFront(nil)
2016年11月11日更新:
我刚刚在您提供的链接中阅读了该问题.有一个窗口可以设置ignoresMouseEvents.即使NSPopover继承自NSObject,你也有一个contentVIEwController,它包含一个视图对象,它保存着d出窗口. (如here所述)
所以简单地设置
popover.contentVIEwController?.vIEw.window?.ignoresMouseEvents = true
d出窗口后显示.
总结以上是内存溢出为你收集整理的macos – 如何使NSPopover正确地跟随鼠标指针并忽略鼠标事件?全部内容,希望文章能够帮你解决macos – 如何使NSPopover正确地跟随鼠标指针并忽略鼠标事件?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)