Как я могу обнаружить сенсорные события в UIImageView внутри глубокой иерархии UIViews? - PullRequest
3 голосов
/ 30 марта 2010

Я занимаюсь разработкой простой игры для iPhone, и я начал с приложения, основанного на View, и через UIViewController я загружаю пользовательский UIView, который содержит еще UIView с и UIImageView с. Я хочу обнаружить сенсорные события на некоторых UIImageView с, но пока не смог.

Я создал второй проект для целей тестирования и решил, что UIImageView s обрабатывает события касания, когда иерархия имеет вид:

UIViewController -> UIView -> UIImageView,

но когда это похоже:

UIViewController -> UIView -> UIView -> UIImageView

они не обнаружены.

Примечания:
- userInteractionEnabled равно YES во всех случаях
- все UIViews и UIImageViews, которые я упоминал выше, являются пользовательскими подклассами.

Можете ли вы придумать какую-либо причину, по которой, когда пользовательский UIImageView становится глубже в иерархии представлений, не может получать сенсорные события?

1 Ответ

4 голосов
/ 30 марта 2010

Касания идут по длинному и окольному маршруту к месту назначения. Официально они идут вверх по цепочке респондента, которая начинается с первого респондента, а затем переходит от представления с самым глубоким касанием к его контроллеру представления, к представлению следующего включения с касанием и т. Д.

Но реальная картина еще сложнее, поскольку при поиске вида, включающего наиболее глубокое касание, касание, по сути, "запрашивает" представление наивысшего уровня для этой информации, вызывая метод hitTest:withEvent:. Это позволяет некоторым суперпредставлениям перехватывать прикосновения, что может быть очень полезно, как в UIScrollView, который иногда делает вещи (прокручивает / увеличивает), прежде чем его подпредставления узнают, что происходит.

Вот несколько советов, которые помогут определить, почему представление может не реагировать на прикосновения:

  • Переопределить [hitTest:withEvent:] 1 для каждого из ваших представлений и NSLog, когда их ударили, чтобы увидеть, кого рассматривают в цепочке респондента.
  • Используйте недокументированный (и, следовательно, извлекаемый перед отправкой) метод UIView recursiveDescription для проверки фреймов всех ваших представлений во время выполнения. Представления по умолчанию отображаются за рамками своих размеров, поэтому они могут выглядеть нормально, но логически они имеют меньшие размеры, чем визуально, и касания реагируют на основе логических (не визуальных) размеров.
  • Это может звучать глупо, но еще раз проверьте, правильно ли ваши методы подключены к выходу, который вы ищете. Например, если вы ожидаете, что ваш метод - [MyClass buttonPressed] будет вызван при касании UIButton, проверьте еще раз, что вы добавили свой экземпляр MyClass и @selector(buttonPressed) в качестве пары цель / действие для эта кнопка.
  • Если ничего из этого не работает, переопределите touchesBegan:withEvent: сообщениями NSLog, чтобы увидеть, где касания идут вверх по цепочке респондента.

И вы уже знаете это, но следите за флагом userInteractionEnabled!

Надеюсь, этого достаточно, чтобы изолировать проблему.

...