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