четверг, 10 сентября 2015 г.

23.Gestures - Жесты

Видео урок находится здесь

В этом уроке рассматриваются виды (жесты) сочетаний прикосновений к экрану устройства.



Простое прикосновение - Tap:

Создание 
  UITapGestureRecognizer *tapGesture=[[UITapGestureRecognizer allocinitWithTarget:self action:@selector(handleTap:)];

Свойства  Tap:

Необходимое Количество пальцев(касаний) при прикосновении 2

    tapGesture.numberOfTouchesRequired=2;

Двойное нажатие (дабы клик)

    tapGesture.numberOfTapsRequired=2;

Прикрепляем обработчик Tap  к главной View контроллера
    [self.view addGestureRecognizer:tapGesture];

Эта функция обработчик вызывается при сработка Tap

-(void) handleTap :(UITapGestureRecognizer*) tapGesture{

    NSLog(@"Tap: %@",NSStringFromCGPoint([tapGesture locationInView:self.view]))

Данный метод предназначен для того, чтобы обработчик ждал двойного клика, если не дожидается срабатывает одинарный:

   [tapGesture requireGestureRecognizerToFail:doubleTapGesture];

Расширение и сужение двумя пальцами (zoom) - Pinch:

    UIPinchGestureRecognizer *pinchGestrue=[[UIPinchGestureRecognizer alloc] initWithTarget:self action:(@selector(handlePinch:))];
    pinchGestrue.delegate=self;

    [self.view addGestureRecognizer:pinchGestrue];

Чтобы  он обрабатывался используем делегаты.
Прописываем, что наш класс поддерживает протокол 

@interface ViewController () <UIGestureRecognizerDelegate>


- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
    
    return YES;

}

Обработчик Pinch

-(void) handlePinch:(UIPinchGestureRecognizer *) pinchGesture{
    NSLog(@"HandlePincht %1@",pinchGesture);
    if (pinchGesture.state==UIGestureRecognizerStateBegan) {
        self.viewScale=1.f;
    }
    CGFloat newScale=1.f+pinchGesture.scale-self.viewScale;
    CGAffineTransform currentTransform=self.testView.transform;
    CGAffineTransform newTransform=CGAffineTransformScale(currentTransform,     newScale,newScale);
    self.testView.transform=newTransform;
    self.viewScale=pinchGesture.scale;
    
}

Вращение - поворот удерживая два пальца на экране -Rotation 

Так же используем делегат, для правильной обработки вращения
 UIRotationGestureRecognizer *rotationGesture=[[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(handleRotation:) ];
    rotationGesture.delegate=self;
    [self.view addGestureRecognizer:rotationGesture];

Обработчик вращения:
-(void) handleRotation:(UIRotationGestureRecognizer *) rotationGesture{
    NSLog(@"handleRotation %@",@(rotationGesture.rotation));
    if (rotationGesture.state==UIGestureRecognizerStateBegan) {
        self.testViewRotation=0;
    }
    CGFloat newRotation= rotationGesture.rotation-self.testViewRotation;
    CGAffineTransform currentTransform=self.testView.transform;
    CGAffineTransform newTransform=CGAffineTransformRotate(currentTransform,newRotation);

    self.testView.transform=newTransform;
    self.testViewRotation =rotationGesture.rotation;
}

Перемещение по экрану не отпуская пальца - Pan

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

Обработчик
-(void) handlePan :(UITapGestureRecognizer*) panGesture{
    CGPoint pointPan=[panGesture locationInView:self.view];
    NSLog(@"handle pan: %@",NSStringFromCGPoint(pointPan));
    self.testView.center=pointPan;
}

Перемещение влево, вправо, вверх или вниз не отпуская пальца - Swipe
    UISwipeGestureRecognizer *verticalSwipeGesture=[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleVerticalSwipe :  )];
    verticalSwipeGesture.direction=UISwipeGestureRecognizerDirectionDown |UISwipeGestureRecognizerDirectionUp;
    verticalSwipeGesture.delegate=self;

    [self.view addGestureRecognizer:verticalSwipeGesture];

Обработчик

-(void) handleVerticalSwipe :(UITapGestureRecognizer*) SwipeGesture{
    CGPoint pointSwipe=[SwipeGesture locationInView:self.view];
    NSLog(@"Vertical swipe : %@",NSStringFromCGPoint(pointSwipe));
    self.testView.center=pointSwipe;
}


Переопределение делегата для правильной работки Swipe
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    
    return [gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]&&[otherGestureRecognizer isKindOfClass:[UISwipeGestureRecognizer class]];
    
}



Домашнее задание к уроку 23 жесты:

Ученик

1. Добавьте квадратную картинку на вьюху вашего контроллера
2. Если хотите, можете сделать ее анимированной

Студент

3. По тачу анимационно передвигайте картинку со ее позиции в позицию тача
4. Если я вдруг делаю тач во время анимации, то картинка должна двигаться в новую точку без рывка (как будто она едет себе и все)

Мастер

5. Если я делаю свайп вправо, то давайте картинке анимацию поворота по часовой стрелке на 360 градусов
6. То же самое для свайпа влево, только анимация должна быть против часовой (не забудьте остановить предыдущее кручение)
7. По двойному тапу двух пальцев останавливайте анимацию

Супермен

8. Добавьте возможность зумить и отдалять картинку используя пинч
9. Добавьте возможность поворачивать картинку используя ротейшн

Выполнил домашнее задание кроме Супермена (на кое-чем затык получался, поэтому надо изучать следующие уроке).


Исходные тексты к игре

Комментариев нет:

Отправить комментарий