【问题标题】:Swift 5 - Mac OS - NSTrackingArea overlapping viewsSwift 5 - Mac OS - NSTrackingArea 重叠视图
【发布时间】:2021-06-05 14:51:03
【问题描述】:

目前我在按钮(NSButton)上有一个小问题,这些按钮有一个跟踪区域和视图(NSViewoverlay),这是我的设置:

自定义按钮:

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

谢谢!!

【问题讨论】:

    标签: swift macos nsview nsbutton nstrackingarea


    【解决方案1】:

    您可以继承NSView 并添加事件的本地监控。检查事件是否发生在视图上,如果为真则返回 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
            }
        }
    }
    

    【讨论】:

    • 当我使用这种方法并在叠加层的某处放置一个按钮时,我无法单击该按钮.. 有什么建议吗?
    • 您可以传播leftMouseDown 事件,因为事件的位置在按钮上方。如果您想知道该事件是否为leftMouseDown,您只需检查其type 属性
    • 请注意,这是为了避免点击视图后面的按钮
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 2015-01-19
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    相关资源
    最近更新 更多