如何在另一个 NSView 下阻止 NSView 事件?

Posted

技术标签:

【中文标题】如何在另一个 NSView 下阻止 NSView 事件?【英文标题】:How to block NSView events under another NSView? 【发布时间】:2012-01-13 22:18:09 【问题描述】:

这是一个想法:

我有一个包含 2 个 NSView 的 NSWindow,我们称它们为 ViewA 和 ViewB。

ViewA 有一个子视图对象列表,每个对象都有自己的跟踪区域集并处理 mouseDown 事件。 ViewB 是一个隐藏视图,它出现在 ViewA 上方。

问题是当ViewB出现时,ViewA仍然接收到mouseDown事件。所以当我点击 ViewB 时,ViewB 后面的对象会收到 mouseDown 事件。我想知道是否有任何方法可以在 ViewB 结束时阻止 ViewA 的事件。

我知道我可以从每个对象上移除跟踪区域,但它仍然响应 mouseDown 事件。

【问题讨论】:

【参考方案1】:

您可以覆盖 NSWindow 上的 sendEvent: 方法并测试“firstResponder”,如果它是 ViewA,则不调用 [super sendEvent:event],这样 ViewA 将不会收到任何事件。

【讨论】:

【参考方案2】:

如果视图 B 是 A 的子视图,问题是它被隐藏了。不要隐藏它:只需将其不透明度设置为 0。这样您就不会看到它,但响应者链会。

【讨论】:

ViewB 也是 NSWindow 的子视图。但我会试试这个。谢谢!【参考方案3】:

如果现在有人仍在寻找此类问题的答案,我只能使用子窗口来做到这一点,this accepted answer 中描述了解决方案。此外,如果您想让窗口透明(/clear coloured),但仍接收鼠标事件,请将此行也付诸实践:

[overlayWindow setIgnoresMouseEvents:NO];

【讨论】:

【参考方案4】:

兄弟视图块,子视图不会因为子视图将鼠标事件上游传播到其父视图。要阻止后代向其父母传播事件,您必须覆盖子事件中的事件,而不是在同一事件上调用 super。调用 super 会将事件传播到其父级。以下是关于事件和命中测试兄弟/下降视图的完整说明:(请注意其密集)http://stylekit.org/blog/2016/01/28/Hit-testing-sub-views/

【讨论】:

【参考方案5】:

您还可以通过[ViewA setAcceptsTouchEvents:NO]; 禁用 ViewA 的触摸事件 并且可以通过再次设置YES 来根据您的要求再次启用它们。

【讨论】:

我相信它只会影响 touch 事件(即触控板特定手势)。我希望鼠标和键盘事件在设置为 NO 的情况下继续工作。

以上是关于如何在另一个 NSView 下阻止 NSView 事件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不重绘整个视图的情况下更新 NSView 的一部分

从 viewcontrollernib 加载 NSView

如何在移动 NSView 时接收通知

如何观察 NSView 帧变化?

在几个 NSView 之间交替

如何使用曲线为 NSView 设置动画