Как заблокировать события NSView под другим NSView? - PullRequest
6 голосов
/ 14 января 2012

Вот идея:

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

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

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

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

Ответы [ 5 ]

1 голос
/ 14 января 2012

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

0 голосов
/ 04 февраля 2016

Блок родственных видов, потомки не видят, так как дочерний процесс будет распространять события мыши перед родительским элементом. Чтобы заблокировать потомков, распространяющих события на своих родителей, вы должны переопределить событие в дочернем элементе и не вызывать super для того же события. Вызов super распространит событие на его родителя Вот полное объяснение по событиям и поразительным взглядам на братьев и сестер / по убыванию:

0 голосов
/ 29 июля 2015

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

[overlayWindow setIgnoresMouseEvents:NO];
0 голосов
/ 14 января 2012

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

0 голосов
/ 14 января 2012

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

...