Spec-Zone .ru
спецификации, руководства, описания, API
Библиотека Разработчика iOS Разработчик
Поиск

Поставка сенсорных событий к представлению вне границ его родительского представления

Q: Мое представление выведено на экран правильно на экране, но не получает сенсорных событий. Почему это?

A: Наиболее распространенная причина этой проблемы состоит в том, потому что Ваше представление расположено вне границ его родительского представления. Когда Ваше приложение получает сенсорное событие, процесс тестирования хита инициируется для определения, какое представление должно получить событие. Процесс запускается с корня иерархии представления, обычно окно приложения, и перерывает подпредставления впереди к задержанному заказу, пока это не находит представление frontmost от касания. То представление становится представлением теста хита и получает сенсорное событие. Если расположение события в его границах, каждое представление, вовлеченное в этот процесс сначала, тестирует. Только после того, как тест успешен, делает передачу представления событие к подпредставлениям для дальнейшего тестирования хита. Таким образом, если Ваше представление находится под касанием, но расположенный вне границ его родительского представления, родительское представление не протестирует расположение события и не передаст сенсорное событие Вашему представлению.

Одно решение этой проблемы состоит в том, чтобы изменить расположение иерархии представления так, чтобы Ваше представление было в границах его родительского представления. Если по некоторым причинам существующее расположение должно сохраняться, можно изменить тестирующее хит поведение родительского представления так, чтобы это не игнорировало сенсорные события. Это может быть сделано путем переопределения - (UIView *)hitTest:withEvent: метод класса родительского представления, как показано в Перечислении 1:

Перечисление 1: Переопределение метода тестирования хита класса родительского представления

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

    // Convert the point to the target view's coordinate system.
    // The target view isn't necessarily the immediate subview
    CGPoint pointForTargetView = [self.targetView convertPoint:point fromView:self];

    if (CGRectContainsPoint(self.targetView.bounds, pointForTargetView)) {

        // The target view may have its view hierarchy,
        // so call its hitTest method to return the right hit-test view
        return [self.targetView hitTest:pointForTargetView withEvent:event];
    }

    return [super hitTest:point withEvent:event];
}

Для получения дополнительной информации о тестировании хита, см. обсуждении Поставки События в Руководстве по Обработке событий для iOS.

Другие возможные причины этой проблемы включают:

  • userInteractionEnabled свойство Вашего представления или любое из его родительских представлений, установлено в НЕТ.

  • Приложение вызвало beginIgnoringInteractionEvents метод без соответствующего вызова к endIgnoringInteractionEvents метод.

Необходимо удостовериться userInteractionEnabled свойство установлено в YES, и приложение не игнорирует пользовательские события, если Вы хотите, чтобы представление было интерактивным.

Если Ваше представление не получает сенсорные события во время анимации, это потому что методы анимации UIView обычно отключайте сенсорные события, в то время как анимации происходят. Можно изменить то поведение путем надлежащего конфигурирования UIViewAnimationOptionAllowUserInteraction опция при запуске UIView анимация.

История версии документа

Дата Примечания
11.04.2014 Новый документ, описывающий, как представление может получить сенсорные события, когда это расположено вне границ его родительского представления.