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
或封闭的 NSClipView
或 NSScrollView
对我也不起作用。
有效的方法是 subclassing NSView
,就像您所做的那样:
class ClickThroughView: NSView {
override func acceptsFirstMouse(for event: NSEvent?) -> Bool {
return true
}
}
...然后设置 NSCollectionViewItem
的 view
以使用此 ClickThroughView
class.
请注意,例如NSImageView
坐在我们的 ClickThroughView
前面会阻止点击事件到达我们的子class,所以你需要子class NSImageView
接受click-through 还有。
我正在尝试使点击生效,这样即使 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
或封闭的 NSClipView
或 NSScrollView
对我也不起作用。
有效的方法是 subclassing NSView
,就像您所做的那样:
class ClickThroughView: NSView {
override func acceptsFirstMouse(for event: NSEvent?) -> Bool {
return true
}
}
...然后设置 NSCollectionViewItem
的 view
以使用此 ClickThroughView
class.
请注意,例如NSImageView
坐在我们的 ClickThroughView
前面会阻止点击事件到达我们的子class,所以你需要子class NSImageView
接受click-through 还有。