0

目前,当涉及到按钮(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上方会打开一个新的覆盖()...

这是问题开始的地方:

当我将鼠标悬停在放置按钮的覆盖层上时,光标仍然会改变......

我不知道 aNSTrackingArea正在浏览所有视图..

我该如何解决这个问题?

我可以在 overlay( NSView) 上设置任何属性以某种方式禁用NSTrackingArea按钮上的 吗?

谢谢!!

4

1 回答 1

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
        }
    }
}
于 2021-03-07T23:24:19.830 回答