6

我很难理解为什么当鼠标位于视图之外时,为什么会为我的 NSView 子类之一调用 mouseDragged 而不是另一个子类。

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

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

有什么明显的我失踪了吗?

4

2 回答 2

0

我也发生了同样的事情。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
    }

于 2022-01-02T03:01:59.273 回答
0

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

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

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

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

有问题的视图也已经在 parentView 中,因此 addSubview: 正在将 myImageView 添加到有问题的视图上方。

这为我解决了这个问题。

于 2019-03-28T08:02:54.670 回答