ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C Часть 1

Распознавание жестов

 

Разработки под iOS в целом требуют не только техническую осведомленность, но и какие никакие, а творческие начала. Рабочая область интерфейса весьма ограничена, а объем функционала это не уменьшает. Встает вопрос – как все это реализовать, не захламляя интерфейс кнопками и прочими излишествами?

iOS дает нам решение в виде обработки жестов/касаний, и в этом уроке я бы хотел рассказать о методе под названием swipe (горизонтальный, либо вертикальный драг). Для начала создадим  новый проект на основе шаблона Single View Application и назовем егоTouchRecognizer.

Теперь перейдем в ViewController.h и добавим в него надпись, в которой будем выводить информации о направлении жеста:

<code data-result="[object Object]">#import &lt;UIKit/UIKit.h&gt;

@interface ViewController : UIViewController

@property (strong, nonatomic) IBOutlet UILabel *swipeInfo;

@end</code>

В первую очередь необходимо создать объект класса UISwipeGestureRecognizer, он и является тем классом, который распознает жесты. При его инициализации мы передаем ссылку, на объект класса, которому будет оповещаться о окончании жеста и функция, которая будет вызвана. Затем, устанавливаем свойству direction значение в зависимости от того, какой тип жеста мы хотим «отлавливать». По завершению добавляем созданный объект представлению, на котором хотим «отлавливать» жест. Перейдем от теории к практике, файл ViewController.m должен выглядеть так:

<code data-result="[object Object]">#import "ViewController.h"

@implementation ViewController

@synthesize swipeInfo;

- (void)viewDidUnload
{
    [super viewDidUnload];
    self.swipeInfo =nil;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] 
                                           initWithTarget:self 
                                           action:@selector(didSwipe:)];
    swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
    [self.view addGestureRecognizer:swipeLeft];

    UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] 
                                            initWithTarget:self 
                                            action:@selector(didSwipe:)];
    swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
    [self.view addGestureRecognizer:swipeRight];

    UISwipeGestureRecognizer *swipeUp = [[UISwipeGestureRecognizer alloc] 
                                         initWithTarget:self 
                                         action:@selector(didSwipe:)];
    swipeUp.direction = UISwipeGestureRecognizerDirectionUp;
    [self.view addGestureRecognizer:swipeUp];

    UISwipeGestureRecognizer *swipeDown = [[UISwipeGestureRecognizer alloc] 
                                           initWithTarget:self 
                                           action:@selector(didSwipe:)];
    swipeDown.direction = UISwipeGestureRecognizerDirectionDown;
    [self.view addGestureRecognizer:swipeDown];
}

-(void)didSwipe:(UISwipeGestureRecognizer*)swipe{
    if (swipe.direction == UISwipeGestureRecognizerDirectionLeft) {
        swipeInfo.text = @"Left";
    } else if (swipe.direction == UISwipeGestureRecognizerDirectionRight) {
        swipeInfo.text = @"Right";
    } else if (swipe.direction == UISwipeGestureRecognizerDirectionUp) {
        swipeInfo.text = @"Up";
    } else if (swipe.direction == UISwipeGestureRecognizerDirectionDown) {
        swipeInfo.text = @"Down";
    }
}

@end</code>

В функции didSwipe, которая вызывается по окончанию жеста, мы определяем тип жеста и присваиваем надписи соответствующий текст. Чтобы текст отображался на экране — следует добавить в файле ViewController.xib объект интерфейса типа UILabel и связать его с swipeInfo.

Аналогичным образом я предлагаю добавить распознавание других жестов:

<code data-result="[object Object]">UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] 
                               initWithTarget:self 
                               action:@selector(handleTap:)];
[self.view addGestureRecognizer:tap];

UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] 
                                   initWithTarget:self 
                                   action:@selector(handlePinch:)];
[self.view addGestureRecognizer:pinch];

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] 
                               initWithTarget:self 
                               action:@selector(handlePan:)];
[self.view addGestureRecognizer:pan];

UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc] 
                                         initWithTarget:self 
                                         action:@selector(handleRotation:)];
[self.view addGestureRecognizer:rotation];

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] 
                                           initWithTarget:self 
                                           action:@selector(handleLongPress:)];
[self.view addGestureRecognizer:longPress];</code>

 

И соответственно, методы их обраобтки:

 

<code data-result="[object Object]">- (void)handleTap:(UITapGestureRecognizer*)recognizer {
    NSLog(@"handleTap:%i", recognizer.state);
}

- (void)handlePinch:(UIPinchGestureRecognizer*)recognizer {
    NSLog(@"handlePinch:%i", recognizer.state);
}

- (void)handlePan:(UIPanGestureRecognizer*)recognizer {
    NSLog(@"handlePan:%i", recognizer.state);
}

- (void)handleRotation:(UIRotationGestureRecognizer*)recognizer {
    NSLog(@"handleRotation:%i", recognizer.state);
}

- (void)handleLongPress:(UILongPressGestureRecognizer*)recognizer {
    NSLog(@"handleLongPress:%i", recognizer.state);
}</code>

 

Как вы заметили, UIGestureRecognizer может не только стать удачной заменой способу обработки касаний приведенному в предыдущем уроке, но и удачно дополнить его. Но здесь следует учитывать один ньюанс. Дело в том, что один UIGestureRecognizer может перекрывать вызов другого UIGestureRecognizer. К примеру, UIPanGestureRecognizer, в котором обрабатывается событие движения не позволяет сработать UISwipeGestureRecognizer, а UILongPressGestureRecognizer блокирует UITapGestureRecognizer.

Но есть в этом классе и положительные моменты. Если вспомнить наше первое знакомство с ScrollView — вы можете неприятно удевиться, что методы касаний на нем не работают (для этого нужно создать отдельный класс, родителем которого будет UIScrollView и в него добавить методы обработки касаний). Тогда как UIGestureRecognizer с успехом справляется со своей задачей.

Comments are closed.