【问题标题】:How to disable mouse clicks and mouse drags on a NSView?如何在 NSView 上禁用鼠标单击和鼠标拖动?
【发布时间】:2020-05-14 16:50:10
【问题描述】:

我正在使用 Swift 制作一个 mac 应用程序,这个应用程序有一个自定义视图(一个扩展 NSView 并覆盖其 draw 方法的类)。现在,我想禁用此视图上的所有鼠标单击和鼠标拖动,并将它们传递给在我的应用程序下运行的其他应用程序。

我尝试了以下方法(从 Apple 文档和其他 SO 问题中收集)来禁用对我的视图的点击,但到目前为止对我没有任何效果:

1.在我的自定义 View 类中覆盖 hitTest

override func hitTest(_ point: NSPoint) -> NSView? {
    let view = super.hitTest(point)
    return view == self ? nil : view
}

2。在我的自定义 View 类中覆盖 AcceptFirstMouse

override func acceptsFirstMouse(for event: NSEvent?) -> Bool {
    return false
}

3.在 ViewController 以及我的自定义 View 类中覆盖 mouseDown

override func mouseDown(with event: NSEvent) {
    // do nothing
}

4.在 ViewController 以及我的自定义 View 类中覆盖 mouseDragged

override func mouseDragged(with event: NSEvent) {
    // do nothing
}

我错过了什么吗?

【问题讨论】:

  • 这个视图(和超级视图等)是否有透明(alpha 1.0)区域?
  • 我猜透明 => alpha 0.0。不,视图没有透明区域。

标签: swift macos cocoa swift5.2


【解决方案1】:

这不是在视图级别处理的,而是在窗口级别处理的。可以将窗口的ignoresMouseEvents属性设置为true。

问题在于 Window Server 只会将事件分派给单个进程。因此,一旦它到达您的应用程序,它就不会进入另一个应用程序。而且你的应用也没有可行的方法来转发它。

【讨论】:

  • 这很有效,太棒了!此外,当我的窗口背景设置为.clear(即使我的自定义视图是不透明的)时,这些事件也会作用于我的应用程序下方的其他应用程序。这正是我想要的。
猜你喜欢
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 2011-08-27
  • 1970-01-01
相关资源
最近更新 更多