如何在另一个 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 事件?的主要内容,如果未能解决你的问题,请参考以下文章