鼠标拖动未在 NSView 的框架外部调用



我正在努力理解为什么当鼠标位于视图之外时,我的一个NSView子类会调用mouseDragged,而另一个子类却没有调用。

类 1 以编程方式添加到 NSWindow,然后将其作为子窗口添加到主应用程序窗口。在视图中单击鼠标并拖动鼠标时,即使鼠标超出视图框架,也会继续调用 mouseDragged。这就是我想要发生的。

子类 2 在 XIB 文件中分配给应用程序主窗口中的自定义视图对象。在这种情况下,仅当鼠标停留在视图中时,才会触发 mouseDragged 事件。

我错过了什么明显的东西吗?

我经历了类似的事情,但它在每个窗口中都是相同的NSView子类。一个(在父窗口中)按预期工作。另一个(在子窗口中)仅在鼠标悬停在视图上时看到鼠标拖动。

事实证明,原因是在与有问题的视图相同的视图中具有NSImageView,但与之重叠。 因为NSImageView只在其部分边界内绘制图像,所以这从来都不是问题,但事实证明这是问题视图跟踪问题的原因。

我调整了 NSImageView 的添加方式,将其放置在子视图的底部:

[parentView addSubview:myImageView positioned:NSWindowBelow relativeTo:nil];

有问题的视图也已经在 parentView 中,所以 addSubview: 在有问题的视图上方添加了 myImageView。

这为我解决了问题。

我也有同样的事情发生。 mouseDragged()只是停止在视图范围之外被调用。它曾经工作正常。不知道发生了什么。

无论如何,这是我的解决方法:


    override func mouseDown(with event: NSEvent) {
        
        let dragMonitor = NSEvent.addLocalMonitorForEvents(matching: [.leftMouseDragged, .leftMouseUp]) { event in
            
            switch event.type {
            case .leftMouseUp: NSEvent.removeMonitor(dragMonitor)
            case.leftMouseDragged: self.coolMouseDragged(with: event)
            default: fatalError()
            }
            
            return event
        }
        
        return event
    }
    func coolMouseDragged(with event: NSEvent) {
        
        /// Do cool stuff
    }

最新更新