【问题标题】:mouseDragged not called outside NSView's framemouseDragged 未在 NSView 框架外调用
【发布时间】:2012-10-06 12:46:33
【问题描述】:

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

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

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

我遗漏了什么明显的东西?

【问题讨论】:

  • 我们能多看一点吗?也许您的视图子类或其他东西 - 因为这看起来不像预期的行为。
  • 我看到了类似的东西,但它是每个窗口中相同的 NSView 子类。一个(在父窗口中)按预期工作。另一个(在子窗口中)仅在鼠标位于视图上方时才看到 mouseDragged。我很想知道系统如何跟踪 mouseDown 视图以知道将 mouseDragged 发送到哪个视图。

标签: objective-c cocoa nsview


【解决方案1】:

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

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

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

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

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

这为我解决了这个问题。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 2019-11-22
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      • 2013-05-11
      • 2011-09-01
      相关资源
      最近更新 更多