iOS. Приемы программирования
Шрифт:
• смахивание;
• вращение;
• щипок;
• панорамирование;
• длинное нажатие;
• нажатие.
Общий принцип обработки жестов с помощью этих встроенных распознавателей таков.
1. Для требуемого распознавателя жестов создается объект данных нужного типа.
2. Этот объект добавляется в качестве распознавателя жестов к тому виду, который будет принимать жесты.
3. Пишется метод, вызываемый при возникновении жеста и осуществляющий указанное вами действие.
Метод, который ассоциируется в качестве целевого метода с любым распознавателем жестов, должен следовать перечисленным далее правилам:
• возвращать void;
• либо
Рассмотрим два примера:
Распознаватели жестов делятся на две категории: дискретные (Discrete) и непрерывные (Continuous). Дискретные распознаватели жестов регистрируют связанные с ними события жестов, а после этого вызывают метод в своем обладателе. Непрерывные распознаватели жестов сообщают своему объекту-обладателю о жесте на протяжении всего того времени, пока этот жест осуществляется, и многократно вызывают метод в своем целевом объекте, пока это событие не закончится.
Например, событие двойного нажатия является дискретным. Хотя оно и состоит из двух нажатий, система улавливает, что промежуток между ними был очень кратким и оба нажатия можно воспринимать как единое событие. Распознаватель двойного нажатия вызывает в своем целевом объекте соответствующий метод, как только будет зарегистрировано двойное нажатие.
Вращение, напротив, обрабатывается непрерывным распознавателем жестов. Как только пользователь начинает вращательный жест, начинается и работа распознавателя, а оканчивается этот жест, только когда пользователь отрывает пальцы от экрана. Метод, предоставляемый классу распознавателя вращательных жестов, вызывается с краткими интервалами до тех пор, пока событие не завершится.
Распознаватели жестов можно добавлять к любому экземпляру класса UIView с помощью метода addGestureRecognizer:, относящегося к виду. При необходимости распознаватели можно удалять, пользуясь методом removeGestureRecognizer:.
У класса UIGestureRecognizer есть свойство под названием state. Свойство state представляет различные состояния распознавателя жестов, которые он принимает в ходе распознавания. Последовательности претерпеваемых состояний различаются у дискретных и непрерывных распознавателей жестов.
Дискретный распознаватель жестов может проходить через три следующих состояния:
• UIGestureRecognizerStatePossible;
• UIGestureRecognizerStateRecognized;
• UIGestureRecognizerStateFailed.
В зависимости от ситуации дискретный распознаватель жестов может сообщать своей цели о состоянии UIGestureRecognizerStateRecognized либо о состоянии UIGestureRecognizerStateFailed, если в процессе распознавания возникнет ошибка.
Непрерывные распознаватели жестов претерпевают иную серию состояний, которые посылают своим целям:
• UIGestureRecognizerStatePossible;
• UIGestureRecognizerStateBegan;
• UIGestureRecognizerStateChanged;
• UIGestureRecognizerStateEnded;
• UIGestureRecognizerStateFailed.
Состояние распознавателя
жестов меняется на UIGestureRecognizerStatePossible в том случае, когда распознаватель собирает в виде информацию о событиях касаний и в любой момент может обнаружить интересующий его жест. Кроме вышеупомянутых состояний непрерывного распознавателя жестов может возникать и состояние UIGestureRecognizerStateCancelled, если жест по какой-то причине прерывается. Например, жест панорамирования может быть прерван входящим телефонным вызовом. В данном случае распознаватель жестов перейдет в состояние UIGestureRecognizerStateCancelled и перестанет отправлять объекту-получателю какие-либо сообщения, если пользователь не повторит всю жестовую последовательность.Опять же, если непрерывный распознаватель жестов столкнется с ситуацией, которую не удается разрешить с помощью имеющихся у системы возможностей, возникнет состояние UIGestureRecognizerStateFailed, а не UIGestureRecognizerStateEnded.
10.1. Обнаружение жестов смахивания
Постановка задачи
Необходимо идентифицировать скользящие жесты смахивания, которые пользователь осуществляет на виде, например, когда убирает картинку с окна.
Решение
Инстанцируйте объект типа UISwipeGestureRecognizer и добавьте его к экземпляру UIView:
Распознаватель жестов может быть создан как автономный объект, но в данном случае, поскольку мы используем распознаватель только с одним видом, мы запрограммировали его как свойство контроллера вида, который будет принимать жест (self.swipeGestureRecognizer). В подразделе «Обсуждение» данного раздела показано применение в этом коде метода handleSwipes:, выступающего в качестве цели для распознавателя жестов смахивания.