2012-01-13 5 views
5

Вот эта идея:Как заблокировать события NSView под другим NSView?

У меня есть NSWindow, содержащий 2 NSView, назовем их ViewA и ViewB.

ViewA имеет список объектов subview, каждый объект имеет свою собственную зону отслеживания и обрабатывает событие mouseDown. ViewB - скрытый вид, который появляется над ViewA.

Проблема заключается в том, что появляется ViewB, ViewA все еще принимает события mouseDown. Поэтому, когда я нажимаю на ViewB, объект за ViewB получает событие mouseDown. Я хотел бы знать, есть ли способ заблокировать события ViewA, пока ViewB над ним.

Я знаю, что я могу удалить зону отслеживания от каждого объекта, но он все равно отвечает на событие mouseDown.

ответ

-5

Вы также можете отключить события касания для ViewA от [ViewA setAcceptsTouchEvents:NO]; и снова включить их в соответствии с вашими требованиями, снова установив YES.

+0

Я считаю, что это влияет только на события * touch * (т. Е. Специфические жесты трекпада). Я ожидал, что мыши и клавиатурные события будут продолжать работать с этим набором в НЕТ. – ipmcc

0

Если вид B является подвидением A, проблема в том, что он скрыт. Не скрывайте это: просто установите его непрозрачность на 0. Таким образом вы не увидите этого, но цепочка ответчиков будет.

+0

ViewB является подвид NSWindow. Но я попробую это. Благодаря! – QyoDeveloper

1

Вы можете переопределить метод sendEvent: на NSWindow и проверить 'firstResponder', если это ViewA, чем не позвонить [super sendEvent:event], так что ViewA не получит никакого события.

0

В случае, если кто-либо еще ищет ответ на этот вопрос в настоящее время, мне удалось это сделать только с дочерним окном, решение описано в this accepted answer. Кроме того, если вы хотите, чтобы сделать окно прозрачным (/ очистить цвета), но по-прежнему получать события мыши на него, поставить эту строку в действие, а также:

[overlayWindow setIgnoresMouseEvents:NO]; 
0

Sibling рассматривает блок, потомок просмотров DonT как ребенок будет progegate mouse events вверх по потоку к родительскому. Чтобы блокировать дочерние элементы, передающие события родителям, вы должны переопределить событие в дочернем элементе и не называть супер на одном и том же событии. Вызов супер будет передавать событие родителям. Вот полное объяснение событий и hittesting sibling/нисходящих просмотров: (будьте осторожны с его плотными) http://stylekit.org/blog/2016/01/28/Hit-testing-sub-views/

Смежные вопросы