这是一个想法:
我有一个包含2个NSView的NSWindow,我们称之为ViewA和ViewB。
ViewA有一个子视图对象列表,每个对象都有自己的跟踪区域集并处理mouseDown事件。 ViewB是隐藏视图,显示在ViewA上方。
问题是当ViewB出现时,ViewA仍然会收到mouseDown事件。因此,当我单击ViewB时,ViewB后面的对象会收到mouseDown事件。我想知道在ViewB结束时是否有任何阻止ViewA事件的方法。
我知道我可以从每个对象中删除跟踪区域,但它仍然会响应mouseDown事件。
答案 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
按照您的要求再次启用它们。