пользовательский жест iOS - PullRequest
2 голосов
/ 19 февраля 2012

Я новичок в iOS / target-C и хочу знать, как создавать собственные жесты. В частности, если пользователь нажимает на правую верхнюю часть экрана и скользит пальцем по краю устройства к нижней части (такой же жест для левой стороны). Я прочитал это:

https://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/GestureRecognizers/GestureRecognizers.html#//apple_ref/doc/uid/TP40009541-CH6-SW2

Но я думаю, что мне сложно понять, как применить его к моему конкретному случаю.

Ответы [ 2 ]

6 голосов
/ 19 февраля 2012

Создание подкласса UIGestureRecognizer - сложная задача.Я очень рекомендую посмотреть видео WWDC2010 по теме Session 120 - Simplifying Touch Event Handling with Gesture Recognizers & Session 121 - Advanced Gesture Recognition.Они тщательны и хорошо сделаны.

Но для очень простого примера, основанного на вашем вопросе, я создал очень простой распознаватель жестов, который срабатывает, когда пользователь касается верхнего левого квадранта присоединенного вида и скользит пальцем.до нижнего правого квадранта прикрепленного вида и поднимает палец, не скользя к левой стороне прикрепленного вида.

RightSlidedown.h:

#import <UIKit/UIGestureRecognizerSubclass.h> // This import is essential
@interface RightSlidedown : UIGestureRecognizer
@end

RightSlidedown.m

#import "RightSlidedown.h"
@implementation RightSlidedown
-(id)initWithTarget:(id)target action:(SEL)action{
    if ((self = [super initWithTarget:target action:action])){
        // so simple there's no setup
    }
    return self;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    if ([touch locationInView:self.view].x < CGRectGetMidX(self.view.bounds)) self.state = UIGestureRecognizerStateFailed;
    else if ([touch locationInView:self.view].y > CGRectGetMidY(self.view.bounds)) self.state = UIGestureRecognizerStateFailed;
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    if([touch locationInView:self.view].x < CGRectGetMidX(self.view.bounds)) self.state = UIGestureRecognizerStateFailed;
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    if ([touch locationInView:self.view].x < CGRectGetMidX(self.view.bounds)) self.state = UIGestureRecognizerStateFailed;
    else if ([touch locationInView:self.view].y < CGRectGetMidY(self.view.bounds)) self.state = UIGestureRecognizerStateFailed;
    else {
            // setting the state to recognized fires the target/action pair of the recognizer
        self.state = UIGestureRecognizerStateRecognized; 
    }
}
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{
    self.state = UIGestureRecognizerStateCancelled;
}
-(void)reset{
    // so simple there's no reset
}
@end

Так что в основном распознаватель жестов получает то, что кажется стандартными сенсорными событиями.(Это не так, но они действуют так).Когда вы реагируете на движения, вы изменяете свойство state вашего распознавателя жестов.

Существует два основных типа распознавателей: «Дискретный» (жест жеста касания) и «Непрерывный» (жест панорамирования).Оба типа автоматически начинаются с UIGestureRecognizerStatePossible в начале.

Для "дискретного" типа, такого как этот, ваша цель состоит в том, чтобы как можно быстрее перейти в состояние UIGestureRecognizerStateRecognized или UIGestureRecognizerStateFailed.

Идеальным вариантом использования этого примера было бы добавление распознавателя жестов RightSlidedown к основному виду нового «Единого приложения представления» в viewDidLoad.

[self.view addGestureRecognizer:[[RightSlidedown alloc] initWithTarget:self action:@selector(rightSlide:)]];

контроллера контроллера. Затемвсе, что требуется, это простой метод действия, например:

-(void)rightSlide:(RightSlidedown *)rsd{
    NSLog(@"right slide");
}
1 голос
/ 19 февраля 2012

Вы можете сделать это, увидев положительную или отрицательную дельту по осям x и y касания. например, жест галочки (√) будет отрицательной дельтой, за которой следует положительная дельта в y, в то время как всегда есть отрицательная дельта с x, и касание заканчивается на более низкой высоте, чем там, где оно началось. Добавьте больше пальцев, вы добавите больше проверок.

псевдокод:

bool firstStroke, secondStroke, motion, override;
while (touchdown){
if (yDelta < 0){firstStroke = TRUE;}
if (firstStroke && yDelta > 0){secondStroke = TRUE;}
if (xDelta < 0){motion = TRUE;}
if (xDelta > 0 || (firstStroke && secondStroke && yDelta < 0)){override = TRUE;}
}
if (firstStroke && secondStroke && motion && start.y > end.y && !override){
    return TRUE;
}else{
    return FALSE;
}

Команда while означает, что пока касание не работает, проверьте 3 вещи:

- Если касание сдвинулось вниз

-После того, как касание переместилось вниз, оно снова переместилось вверх

-Если касание перемещается справа налево

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

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...