如何解决Swift 5 - Mac OS - NSTrackingArea 重叠视图
目前我在按钮(NSButton
)上有一个小问题,这些按钮在这些按钮上方有一个跟踪区域和视图(NSView
叠加层),这是我的设置:
自定义按钮:
class AppButton: NSButton {
override func updateTrackingAreas() {
super.updateTrackingAreas()
let area = NSTrackingArea(
rect: self.bounds,options: [.mouseEnteredAndExited,.activeAlways],owner: self,userInfo: nil
)
self.addTrackingArea(area)
}
override func mouseEntered(with event: NSEvent) {
NSCursor.pointingHand.set()
}
override func mouseExited(with event: NSEvent) {
NSCursor.arrow.set()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
这个按钮类的一个实例在一个非常基本的 NSView
中使用。
当我将鼠标悬停在按钮上时,光标会正确更改。
当我单击按钮时,会在按钮上方打开一个新的叠加层 (NSView
)...
问题由此开始:
当我将鼠标悬停在放置按钮的叠加层上时,光标仍然会发生变化...
我不知道 NSTrackingArea
会浏览所有视图..
我该如何解决这个问题?
我可以在叠加层 (NSView
) 上设置任何属性以某种方式禁用按钮上的 NSTrackingArea
吗?
谢谢!!
解决方法
您可以子类化 NSView
并为事件添加本地监控。检查事件是否发生在视图上,如果 true 返回 nil。这将避免传播被监视的事件。如果事件在视图框架之外,您可以正常传播它,返回所监视的事件。
class CustomView: NSView {
override func viewWillMove(toSuperview newSuperview: NSView?) {
super.viewWillMove(toSuperview: newSuperview)
wantsLayer = true
layer?.backgroundColor = NSColor.windowBackgroundColor.cgColor
layer?.borderWidth = 1
NSEvent.addLocalMonitorForEvents(matching: [.mouseEntered,.mouseExited,.leftMouseDown]) { event in
if self.frame.contains(event.locationInWindow) {
// if cursor is over the view just return nil to do not propagate the events
return nil
}
return event
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。