2012-01-13 190 views
5

这里的想法:如何阻止其他NSView下的NSView事件?

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

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

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

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

回答

-5

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

+0

我相信只会影响* touch *事件(即触控板特定的手势)。我希望鼠标和键盘事件可以继续使用设置为NO。 – ipmcc 2012-01-15 17:03:53

0

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

+0

ViewB也是NSWindow的子视图。但我会试试这个。谢谢! – QyoDeveloper 2012-01-16 17:18:47

1

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

0

如果任何人现在仍在寻找这类问题的答案,我只能设法通过子窗口来做到这一点,解决方案在this accepted answer中描述。另外,如果你想使窗口透明(/透明色),但仍然在它接收鼠标事件,就把这条线转化为行动,以及:

[overlayWindow setIgnoresMouseEvents:NO]; 
0

兄弟姐妹看待块,后代的观点不为孩子向上游推送鼠标事件。为了阻止向其父母传播事件的后代,您必须在孩子身上覆盖事件,并且不要在同一事件中致电超级事件。召唤超级会将事件推送给其父母。这里是事件和击中兄弟/降序视图的全面探索:(被警告其密集)http://stylekit.org/blog/2016/01/28/Hit-testing-sub-views/