【问题标题】:acceptsFirstMouse click through on macOS在 macOS 上接受FirstMouse 点击
【发布时间】:2018-07-30 09:31:20
【问题描述】:

我正在尝试让 click-though 工作,以便我的应用程序即使在窗口处于非活动状态时也会响应鼠标点击。我有一个带有响应鼠标事件的 NSCollectionView 项目的 collectionView。我已经尝试对 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
      }
  }    
}

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

【问题讨论】:

    标签: swift macos cocoa subclass nscollectionview


    【解决方案1】:

    我刚看到同样的问题;子类化 NSCollectionView 或封闭的 NSClipViewNSScrollView 也不适用于我。

    有效的方法是子类化 NSView,就像你做的那样:

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

    ...然后将NSCollectionViewItemview 设置为使用这个ClickThroughView 类。

    请注意,例如NSImageView 位于我们的 ClickThroughView 前面将阻止点击事件到达我们的子类,因此您还需要将 NSImageView 子类化以接受点击。

    【讨论】:

    • 我不知道 NSImageView 有一个可以被覆盖的acceptsFirstMouse 函数。子类化 NSImageView 效果很好。
    • @DaveC 太好了! NSImageView 继承自 NSView,所以是的,当然。 :) 顺便说一下,我做了什么:继承 NSCollectionViewItem 的视图,如上所述,然后也继承 NSImageView,在 hitTest(point:) 方法中返回 nil。这也将防止 NSImageView 阻止点击。
    • 还有一个图像视图挡住了我的按钮。好电话!
    • 这是快速即插即用的要点 → gist.github.com/tyirvine/93ee7b4d6f44ee333cdfc5f419f11389
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      • 2020-11-28
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多