Создание подкласса 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");
}