Состояние распознавателя жестов меняется на UIGestureRecognizerStatePossible в том случае, когда распознаватель собирает в виде информацию о событиях касаний и в любой момент может обнаружить интересующий его жест. Кроме вышеупомянутых состояний непрерывного распознавателя жестов может возникать и состояние UIGestureRecognizerStateCancelled, если жест по какой-то причине прерывается. Например, жест панорамирования может быть прерван входящим телефонным вызовом. В данном случае распознаватель жестов перейдет в состояние UIGestureRecognizerStateCancelled и перестанет отправлять объекту-получателю какие-либо сообщения, если пользователь не повторит всю жестовую последовательность.
Опять же, если непрерывный распознаватель жестов столкнется с ситуацией, которую не удается разрешить с помощью имеющихся у системы возможностей, возникнет состояние UIGestureRecognizerStateFailed, а не UIGestureRecognizerStateEnded.
10.1. Обнаружение жестов смахивания
Постановка задачи
Необходимо идентифицировать скользящие жесты смахивания, которые пользователь осуществляет на виде, например, когда убирает картинку с окна.
Решение
Инстанцируйте объект типа UISwipeGestureRecognizer и добавьте его к экземпляру UIView:
#import «ViewController.h»
@interface ViewController ()
@property (nonatomic, strong)
UISwipeGestureRecognizer *swipeGestureRecognizer;
@end
@implementation ViewController
— (void)viewDidLoad {
[super viewDidLoad];
/* Инстанцируем объект. */
self.swipeGestureRecognizer = [[UISwipeGestureRecognizer alloc]
initWithTarget: self
action:@selector(handleSwipes:)];
/* Необходимо обнаруживать жесты смахивания,
направленные справа налево. */
self.swipeGestureRecognizer.direction =
UISwipeGestureRecognizerDirectionLeft;
/* Нужен только один палец. */
self.swipeGestureRecognizer.numberOfTouchesRequired = 1;
/* Добавляем к виду. */
[self.view addGestureRecognizer: self.swipeGestureRecognizer];
}
Распознаватель жестов может быть создан как автономный объект, но в данном случае, поскольку мы используем распознаватель только с одним видом, мы запрограммировали его как свойство контроллера вида, который будет принимать жест (self.swipeGestureRecognizer). В подразделе «Обсуждение» данного раздела показано применение в этом коде метода handleSwipes:, выступающего в качестве цели для распознавателя жестов смахивания.
Обсуждение
Жест смахивания (скольжения) — одно из наиболее простых движений, регистрируемых встроенными распознавателями жестов, входящими в состав iOS SDK. Это простое движение одного или нескольких пальцев по экрану в том или ином направлении. Класс UISwipeGestureRecognizer, как и любые другие распознаватели жестов, наследует от класса UIGestureRecognizer и добавляет к нему различные функции. В частности, это свойства, позволяющие указывать направление, в котором должны выполняться жесты смахивания, чтобы система их обнаружила, а также определять, сколько пальцев пользователь должен держать на экране, чтобы можно было совершить жест смахивания. Не забывайте, что жесты смахивания являются дискретными.
Метод handleSwipes:, которым мы воспользовались при написании распознавателя жестов, можно реализовать следующим образом:
— (void) handleSwipes:(UISwipeGestureRecognizer *)paramSender{
if (paramSender.direction & UISwipeGestureRecognizerDirectionDown){
NSLog(@"Swiped Down.");
}
if (paramSender.direction & UISwipeGestureRecognizerDirectionLeft){