Некоторые события, возникающие при работе приложения, могут быть сложны для обработки и требовать, чтобы одно и то же событие обнаруживалось в разных видах отдельно взятого приложения. Таким образом, возникает необходимость в распознавателях жестов, пригодных для многократного использования. В iOS SDK 5 интегрированы распознаватели шести жестов, таких как:
• смахивание;
• вращение;
• щипок;
• панорамирование;
• длинное нажатие;
• нажатие.
Общий принцип обработки жестов с помощью этих встроенных распознавателей таков.
1. Для требуемого распознавателя жестов создается объект данных нужного типа.
2. Этот объект добавляется в качестве распознавателя жестов к тому виду, который будет принимать жесты.
3. Пишется метод, вызываемый при возникновении жеста и осуществляющий указанное вами действие.
Метод, который ассоциируется в качестве целевого метода с любым распознавателем жестов, должен следовать перечисленным далее правилам:
• возвращать void;
• либо не принимать параметров, либо принимать единственный параметр типа UIGestureRecognizer, в котором система будет передавать распознаватель жестов, вызывающий данный метод.
Рассмотрим два примера:
— (void) tapRecognizer:(UITapGestureRecognizer *)paramSender{
/* */
}
— (void) tapRecognizer{
/* */
}
Распознаватели жестов делятся на две категории:
Например, событие двойного нажатия является дискретным. Хотя оно и состоит из двух нажатий, система улавливает, что промежуток между ними был очень кратким и оба нажатия можно воспринимать как единое событие. Распознаватель двойного нажатия вызывает в своем целевом объекте соответствующий метод, как только будет зарегистрировано двойное нажатие.
Вращение, напротив, обрабатывается непрерывным распознавателем жестов. Как только пользователь начинает вращательный жест, начинается и работа распознавателя, а оканчивается этот жест, только когда пользователь отрывает пальцы от экрана. Метод, предоставляемый классу распознавателя вращательных жестов, вызывается с краткими интервалами до тех пор, пока событие не завершится.
Распознаватели жестов можно добавлять к любому экземпляру класса UIView с помощью метода addGestureRecognizer:, относящегося к виду. При необходимости распознаватели можно удалять, пользуясь методом removeGestureRecognizer:.
У класса UIGestureRecognizer есть свойство под названием state. Свойство state представляет различные состояния распознавателя жестов, которые он принимает в ходе распознавания. Последовательности претерпеваемых состояний различаются у дискретных и непрерывных распознавателей жестов.
Дискретный распознаватель жестов может проходить через три следующих состояния:
• UIGestureRecognizerStatePossible;
• UIGestureRecognizerStateRecognized;
• UIGestureRecognizerStateFailed.
В зависимости от ситуации дискретный распознаватель жестов может сообщать своей цели о состоянии UIGestureRecognizerStateRecognized либо о состоянии UIGestureRecognizerStateFailed, если в процессе распознавания возникнет ошибка.
Непрерывные распознаватели жестов претерпевают иную серию состояний, которые посылают своим целям:
• UIGestureRecognizerStatePossible;
• UIGestureRecognizerStateBegan;
• UIGestureRecognizerStateChanged;
• UIGestureRecognizerStateEnded;
• UIGestureRecognizerStateFailed.