acceptsFirstMouse 在 macOS 上点击

acceptsFirstMouse click through on macOS

我正在尝试使点击生效,这样即使 window 处于非活动状态,我的应用程序也能响应鼠标点击。我有一个 collectionView,其中包含响应鼠标事件的 NSCollectionView 项。我已经尝试对 collectViewItem 使用的视图进行子类化,并且还对用于 NSCollectionView 的视图进行子类化。它不起作用。 子类视图的代码如下所示:

import Cocoa

class SubclassedView: NSView {

  override func draw(_ dirtyRect: NSRect) {
      super.draw(dirtyRect)
  }

  // adding this override should allow click-through so buttons can be clicked even with an inactive window
  // it doesn't work
  override func acceptsFirstMouse(for event: NSEvent?) -> Bool {
      print("got first mouse")
      return true
  }

  override var acceptsFirstResponder :Bool {
      get {
          return true
      }
  }    
}

有人知道这里出了什么问题吗?

您需要通过添加以下代码来更改您的 window 行为:

window.collectionBehavior = .stationary;
window.level = .mainMenu + 1;
window.hidesOnDeactivate = false;

我刚看到同样的问题; subclassing NSCollectionView 或封闭的 NSClipViewNSScrollView 对我也不起作用。

有效的方法是 subclassing NSView,就像您所做的那样:

class ClickThroughView: NSView {
    override func acceptsFirstMouse(for event: NSEvent?) -> Bool {
        return true
    }
}

...然后设置 NSCollectionViewItemview 以使用此 ClickThroughView class.

请注意,例如NSImageView 坐在我们的 ClickThroughView 前面会阻止点击事件到达我们的子class,所以你需要子class NSImageView 接受click-through 还有。