Поставка события: цепочка респондента
При разработке приложения вероятно, что Вы хотите реагировать на события динамично. Например, касание может произойти во многих различных объектах на экране, и необходимо решить, какой объект Вы хотите реагировать на данное событие и понять, как тот объект получает событие.
То, когда сгенерированное пользователями событие имеет место, UIKit создает объект-событие, содержащий информацию, должно было обработать событие. Тогда это помещает объект-событие в очередь событий активного приложения. Для сенсорных событий тот объект является рядом касаний, упакованных в a UIEvent
объект. Для событий движения варьируется объект-событие, в зависимости от которой платформы Вы используете и каким событием движения Вы интересуетесь.
Событие перемещается вдоль определенного пути, пока оно не поставлено объекту, который может обработать его. Во-первых, одиночный элемент UIApplication
объект берет событие сверху очереди и диспетчеризирует ее для обработки. Как правило, это отправляет событие в ключевой объект окна приложения, передающий событие начальному объекту для обработки. Начальный объект зависит от типа события.
Сенсорные события. Для сенсорных событий объект окна сначала пытается поставить событие представлению, где произошло касание. То представление известно как представление теста хита. Процесс нахождения представления теста хита вызывают тестированием хита, описанным в Тестирующих хит Возвратах Представление, Где Произошло Касание.
Движение и события дистанционного управления. С этими событиями объект окна отправляет встряхивающее движение или событие дистанционного управления первому респонденту для обработки. Первый респондент описан в Цепочке Респондента, Составлен из Объектов Респондента.
Конечная цель этих, которые соединяет каналом событие, должна найти объект, который может обработать и реагировать на событие. Поэтому UIKit сначала отправляет событие в объект, подходящий лучше всего для обработки события. Для сенсорных событий тот объект является представлением теста хита, и для других событий, тот объект является первым респондентом. Следующие разделы объясняют более подробно, как определяются представление теста хита и первые объекты респондента.
Тестирование хита возвращает представление, где произошло касание
iOS использует тестирование хита для нахождения представления, находящегося под касанием. Тестирование хита включает проверку, является ли касание в границах каких-либо соответствующих объектов представления. Если это, это рекурсивно проверяет все подпредставления того представления. Самое низкое представление в иерархии представления, содержащей точку соприкосновения, становится представлением теста хита. После того, как iOS определяет представление теста хита, оно передает сенсорное событие тому представлению для обработки.
Для иллюстрирования предположите, что пользователь касается представления E на рисунке 2-1. iOS находит представление теста хита путем проверки подпредставлений в этот порядок:
Касание в границах представления A, таким образом, это проверяет подпредставления B и C.
Касание не в границах представления B, но это в границах представления C, таким образом, это проверяет подпредставления D и E.
Касание не в границах представления D, но это в границах представления E.
Представление E является самым низким представлением в иерархии представления, содержащей касание, таким образом, это становится представлением теста хита.
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
классы являются респондентами, что означает, что все представления и большинство ключевых объектов контроллера являются респондентами. Обратите внимание на то, что Базовые Слои анимации не являются респондентами.
Первый респондент назначен для получения событий сначала. Как правило, первый респондент является объектом представления. Объект становится первым респондентом путем выполнения двух вещей:
Переопределение
canBecomeFirstResponder
метод для возвратаYES
.Получение a
becomeFirstResponder
сообщение. Если необходимо, объект может отправить себе это сообщение.
События не являются единственными объектами, полагающимися на цепочку респондента. Цепочка респондента используется во всем следующем:
Сенсорные события. Если представление теста хита не может обработать сенсорное событие, от события отказываются цепочка респондентов, запускающаяся с представления теста хита.
События движения. Для обработки событий движения встряски с UIKit первый респондент должен реализовать любого
motionBegan:withEvent:
илиmotionEnded:withEvent:
методUIResponder
класс, как описано в Обнаружении Событий Движения встряски с UIEvent.События дистанционного управления. Для обработки событий дистанционного управления первый респондент должен реализовать
remoteControlReceivedWithEvent:
методUIResponder
класс.Сообщения действия. Когда пользователь управляет управлением, таким как кнопка или переключатель, и цель для метода действия
nil
, сообщение отправляется через цепочку респондентов начиная с представления управления.Сообщения меню редактирования. Когда пользователь касается команд меню редактирования, iOS использует цепочку респондента для нахождения объекта, реализующего необходимые методы (такой как
cut:
,copy:
, иpaste:
). Для получения дополнительной информации посмотрите Отображение и Управление Меню Редактирования и проектом примера кода, CopyPasteTile.Редактирование текста. Когда пользователь касается текстового поля или текстового представления, то представление автоматически становится первым респондентом. По умолчанию виртуальная клавиатура появляется и текстовое поле, или текстовое представление становится фокусом редактирования. Можно вывести на экран пользовательское входное представление вместо клавиатуры, если это подходяще для приложения. Можно также добавить пользовательское входное представление к любому объекту респондента. Для получения дополнительной информации посмотрите Пользовательские Представления для Ввода данных.
UIKit автоматически устанавливает текстовое поле или текстовое представление, что пользователь касается, чтобы быть первым респондентом; Приложения должны явно установить все другие первые объекты респондента с becomeFirstResponder
метод.
Цепочка респондента следует за определенным путем поставки
Если начальный объект — или представление теста хита или первый респондент — не обрабатывает событие, UIKit передает событие следующему респонденту в цепочке. Каждый респондент решает, хочет ли это обработать событие или передать его его собственному следующему респонденту путем вызова nextResponder
метод. Этот процесс продолжается до объекта респондента или обрабатывает событие или больше нет респондентов.
Последовательность цепочки респондента начинается, когда iOS обнаруживает событие и передает его начальному объекту, который обычно является представлением. Начальное представление имеет первую возможность обработать событие. Рисунок 2-2 показывает два различных пути поставки события для двух конфигураций приложения. Путь поставки события приложения зависит от своей определенной конструкции, но все пути поставки события придерживаются той же эвристики.
Для приложения слева, событие следует за этим путем:
Начальное представление пытается обработать событие или сообщение. Если это не может обработать событие, это передает событие своему суперпредставлению, потому что начальное представление не является самым верхним представлением в своей иерархии представления контроллера представления.
Суперпредставление пытается обработать событие. Если суперпредставление не может обработать событие, оно передает событие своему суперпредставлению, потому что это все еще не самое верхнее представление в иерархии представления.
Самое верхнее представление в иерархии представления контроллера представления пытается обработать событие. Если самое верхнее представление не может обработать событие, оно передает событие своему контроллеру представления.
Контроллер представления пытается обработать событие, и если это не может, передать событие окну.
Если объект окна не может обработать событие, он передает событие одиночный элемент объект приложения.
Если объект приложения не может обработать событие, он отбрасывает событие.
Приложение справа следует за немного отличающимся путем, но все пути поставки события следуют за этой эвристикой:
Представление передает событие его иерархия представления контроллера представления, пока оно не достигает самого верхнего представления.
Самое верхнее представление передает событие своему контроллеру представления.
Контроллер представления передает событие суперпредставлению своего самого верхнего представления.
Повторение шагов 1-3 до события достигает корневого контроллера представления.
Корневой контроллер представления передает событие объекту окна.
Окно передает событие объекту приложения.