Поставка события: цепочка респондента

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

То, когда сгенерированное пользователями событие имеет место, UIKit создает объект-событие, содержащий информацию, должно было обработать событие. Тогда это помещает объект-событие в очередь событий активного приложения. Для сенсорных событий тот объект является рядом касаний, упакованных в a UIEvent объект. Для событий движения варьируется объект-событие, в зависимости от которой платформы Вы используете и каким событием движения Вы интересуетесь.

Событие перемещается вдоль определенного пути, пока оно не поставлено объекту, который может обработать его. Во-первых, одиночный элемент UIApplication объект берет событие сверху очереди и диспетчеризирует ее для обработки. Как правило, это отправляет событие в ключевой объект окна приложения, передающий событие начальному объекту для обработки. Начальный объект зависит от типа события.

Конечная цель этих, которые соединяет каналом событие, должна найти объект, который может обработать и реагировать на событие. Поэтому UIKit сначала отправляет событие в объект, подходящий лучше всего для обработки события. Для сенсорных событий тот объект является представлением теста хита, и для других событий, тот объект является первым респондентом. Следующие разделы объясняют более подробно, как определяются представление теста хита и первые объекты респондента.

Тестирование хита возвращает представление, где произошло касание

iOS использует тестирование хита для нахождения представления, находящегося под касанием. Тестирование хита включает проверку, является ли касание в границах каких-либо соответствующих объектов представления. Если это, это рекурсивно проверяет все подпредставления того представления. Самое низкое представление в иерархии представления, содержащей точку соприкосновения, становится представлением теста хита. После того, как iOS определяет представление теста хита, оно передает сенсорное событие тому представлению для обработки.

Для иллюстрирования предположите, что пользователь касается представления E на рисунке 2-1. iOS находит представление теста хита путем проверки подпредставлений в этот порядок:

  1. Касание в границах представления A, таким образом, это проверяет подпредставления B и C.

  2. Касание не в границах представления B, но это в границах представления C, таким образом, это проверяет подпредставления D и E.

  3. Касание не в границах представления D, но это в границах представления E.

    Представление E является самым низким представлением в иерархии представления, содержащей касание, таким образом, это становится представлением теста хита.

  Тестирование хита рисунка 2-1 возвращает затронутое подпредставление

hitTest:withEvent: метод возвращает тестовое представление хита для данного CGPoint и UIEvent. hitTest:withEvent: метод начинается путем вызова pointInside:withEvent: метод на себе. Если точка передала в hitTest:withEvent: в границах представления, pointInside:withEvent: возвраты YES. Затем метод рекурсивно вызывает hitTest:withEvent: на каждом возвращающемся подпредставлении YES.

Если точка передала в hitTest:withEvent: не в границах представления, первого вызова к pointInside:withEvent: возвраты метода NO, точка проигнорирована, и hitTest:withEvent: возвраты nil. Если возвращается подпредставление NO, то целое ответвление иерархии представления проигнорировано, потому что, если касание не происходило в том подпредставлении, это также не происходило ни в одном из подпредставлений того подпредставления. Это означает, что любая точка в подпредставлении, которое является за пределами его суперпредставления, не может получить сенсорные события, потому что точка соприкосновения должна быть в границах суперпредставления и подпредставления. Это может произойти если подпредставление clipsToBounds свойство установлено в NO.

Мнение теста хита высказано первая возможность обработать сенсорное событие. Если представление теста хита не может обработать событие, перемещения события, что цепочка представления респондентов, как описано в Цепочке Респондента Составлена из Объектов Респондента, пока система не находит объект, который может обработать его.

Цепочка респондента составлена из объектов респондента

Много типов событий полагаются на цепочку респондента для поставки события. Цепочка респондента является серией соединенных объектов респондента. Это запускается с первого респондента и заканчивается объектом приложения. Если первый респондент не может обработать событие, оно передает событие следующему респонденту в цепочке респондента.

Объект респондента является объектом, который может ответить на и обработать события. UIResponder класс является базовым классом для всех объектов респондента, и это определяет программируемый интерфейс не только для обработки событий, но также и для общего поведения респондента. Экземпляры UIApplication, UIViewController, и UIView классы являются респондентами, что означает, что все представления и большинство ключевых объектов контроллера являются респондентами. Обратите внимание на то, что Базовые Слои анимации не являются респондентами.

Первый респондент назначен для получения событий сначала. Как правило, первый респондент является объектом представления. Объект становится первым респондентом путем выполнения двух вещей:

  1. Переопределение canBecomeFirstResponder метод для возврата YES.

  2. Получение a becomeFirstResponder сообщение. Если необходимо, объект может отправить себе это сообщение.

События не являются единственными объектами, полагающимися на цепочку респондента. Цепочка респондента используется во всем следующем:

UIKit автоматически устанавливает текстовое поле или текстовое представление, что пользователь касается, чтобы быть первым респондентом; Приложения должны явно установить все другие первые объекты респондента с becomeFirstResponder метод.

Цепочка респондента следует за определенным путем поставки

Если начальный объект — или представление теста хита или первый респондент — не обрабатывает событие, UIKit передает событие следующему респонденту в цепочке. Каждый респондент решает, хочет ли это обработать событие или передать его его собственному следующему респонденту путем вызова nextResponder метод. Этот процесс продолжается до объекта респондента или обрабатывает событие или больше нет респондентов.

Последовательность цепочки респондента начинается, когда iOS обнаруживает событие и передает его начальному объекту, который обычно является представлением. Начальное представление имеет первую возможность обработать событие. Рисунок 2-2 показывает два различных пути поставки события для двух конфигураций приложения. Путь поставки события приложения зависит от своей определенной конструкции, но все пути поставки события придерживаются той же эвристики.

Рисунок 2-2  цепочка респондента на iOS

Для приложения слева, событие следует за этим путем:

  1. Начальное представление пытается обработать событие или сообщение. Если это не может обработать событие, это передает событие своему суперпредставлению, потому что начальное представление не является самым верхним представлением в своей иерархии представления контроллера представления.

  2. Суперпредставление пытается обработать событие. Если суперпредставление не может обработать событие, оно передает событие своему суперпредставлению, потому что это все еще не самое верхнее представление в иерархии представления.

  3. Самое верхнее представление в иерархии представления контроллера представления пытается обработать событие. Если самое верхнее представление не может обработать событие, оно передает событие своему контроллеру представления.

  4. Контроллер представления пытается обработать событие, и если это не может, передать событие окну.

  5. Если объект окна не может обработать событие, он передает событие одиночный элемент объект приложения.

  6. Если объект приложения не может обработать событие, он отбрасывает событие.

Приложение справа следует за немного отличающимся путем, но все пути поставки события следуют за этой эвристикой:

  1. Представление передает событие его иерархия представления контроллера представления, пока оно не достигает самого верхнего представления.

  2. Самое верхнее представление передает событие своему контроллеру представления.

  3. Контроллер представления передает событие суперпредставлению своего самого верхнего представления.

    Повторение шагов 1-3 до события достигает корневого контроллера представления.

  4. Корневой контроллер представления передает событие объекту окна.

  5. Окно передает событие объекту приложения.