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

时间:2012-01-13 22:18:10

标签: objective-c macos cocoa nsview

这是一个想法:

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

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

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

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

5 个答案:

答案 0 :(得分:1)

您可以覆盖NSWindow上的sendEvent:方法并测试'firstResponder'(如果是ViewA),而不是调用[super sendEvent:event],以便ViewA不会收到任何事件。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果现在还有人在寻找这类问题的答案,我只能通过this accepted answer中描述的子窗口设法解决这个问题。此外,如果您想使窗口透明(/透明色),但仍然在其上接收鼠标事件,请将此行也付诸行动:

[overlayWindow setIgnoresMouseEvents:NO];

答案 3 :(得分:0)

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

答案 4 :(得分:-5)

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