Обнаружение ЛЮБОГО прикосновения в представлении (iPhone SDK) - PullRequest
7 голосов
/ 11 апреля 2010

Я сейчас использую ...

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

для обнаружения ударов. У меня все работает. Единственная проблема заключается в том, что если пользователь касается чего-либо поверх (например, кнопки UIB или чего-то еще), - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { не вызывается. Есть ли что-то вроде touchsBegan, но сработает, если я коснусь ЛЮБОГО ГЛАВНОГО в окне?

Заранее спасибо, David

Ответы [ 2 ]

13 голосов
/ 12 апреля 2010

События касания распространяются так:

  1. UIViews отправляются -hitTest: withEvent: рекурсивно, пока какой-то UIView не решит, что касание находится внутри его границ, а не внутри какого-либо подпредставления с поддержкой взаимодействия с пользователем.
  2. UIWindow отправляет -touchesBegan: withEvent: и друзей в UIView, возвращенный на шаге 1, игнорируя любую иерархию представлений.

Другими словами, -hitTest: withEvent: используется для определения целевого вида касания, после чего целевое представление получает все -туши ...: withEvent: Сообщения. Если вам нужно перехватить жест смахивания, который может начинаться с кнопки UIB, вам придется переопределить -hitTest: withEvent: , чтобы вернуть self .

Но есть проблема с этим подходом. Как только вы это сделаете, ваша кнопка перестанет работать, потому что она не будет получать никаких сообщений -touches ...: withEvent: . Вам придется перенаправлять касания в подпредставления вручную, если только вы не обнаружите жест смахивания. Это серьезная боль в заднице, и она совсем не гарантирована. Вот для чего нужны UIGestureRecognizers.

Другой подход заключается в создании подкласса UIWindow и переопределении -sendEvent: , что может работать лучше в вашем случае.

В любом случае, внимательно прочитайте документацию Обработка событий . Среди других страшных предупреждений говорится:

Классы фреймворка UIKit: не предназначен для получения прикосновений, которые не связаны с ними; в программном термины, это означает, что мнение свойство объекта UITouch должно держать ссылку на рамки объект для того, чтобы прикосновение было обрабатываются.

0 голосов
/ 11 апреля 2010

Я думаю, что вы должны иметь один или другой. Хотите, чтобы iPhone обнаруживал касание в верхней части кнопки или касание в верхней части экрана? Я не думаю, что вы можете сделать оба одновременно, и я был бы удивлен, если бы вы могли. Извините за отсутствие лучшего ответа для вас ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...