1、UIGestureRecognizer介绍:
iOS系统在3.2以后,为方便开发这使用一些常用的手势,提供了UIGestureRecognizer类。手势识别UIGestureRecognizer类是个抽象类,下面的子类是具体的手势,开发者可以直接使用这些手势识别。
1 UITapGestureRecognizer //点击
2 UIPinchGestureRecognizer //捏合
3 UIRotationGestureRecognizer //旋转
4 UISwipeGestureRecognizer //清扫
5 UIPanGestureRecognizer //拖拽
6 UILongPressGestureRecognizer //长按
7 自定义手势
2、使用手势的步骤
使用手势很简单,分为两步:
1.创建手势实例。当创建手势时,指定一个回调方法,当手势开始,改变、或结束时,回调方法被调用。
2.添加到需要识别的View中(addGestureRecognizer)。每个手势只对应一个View,当屏幕触摸在View的边界内时,如果手势和预定的一样,那就会回调方法。当手势不用时删除(removeGestureRecognizer)。
ps:一个手势只能对应一个View,但是一个View可以有多个手势。
3、手势通用方法或属性
- (CGPoint)locationInView:(nullable UIView*)view; // 用来返回该手势在View控件中的触碰位置
- (CGPoint)translationInView:(nullable UIView*)view; // 用来返回该手势在View控件中的位移
- (NSUInteger)numberOfTouches; // 返回该手势包含的触碰点的数量(也就是用户用了几个手指触摸
- (CGPoint)locationOfTouch:(NSUInteger)touchIndex inView:(nullable UIView*)view; // 用来返回手势中第 touchIndex 个触碰点在View控件中的位置
@property(nonatomic,readonly) UIGestureRecognizerState state; // 该属性可以获取到手势的状态
说明:长按手势的常用状态如下
开始:UIGestureRecognizerStateBegan
改变:UIGestureRecognizerStateChanged
结束:UIGestureRecognizerStateEnded
取消:UIGestureRecognizerStateCancelled
失败:UIGestureRecognizerStateFailed
@property(nonatomic, getter=isEnabled) BOOL enabled; // 该属性用来设置和返回该手势处理器是否可用
@property(nullable, nonatomic,readonly) UIView *view; // 该属性用来返回触发该手势对应的UI控件
4、分手势介绍
- UITapGestureRecognizer : 用来处理用户的点击手势
@property (nonatomic) NSUInteger numberOfTapsRequired; // 该属性用来指定手势处理器只处理几次触摸事件
@property (nonatomic) NSUInteger numberOfTouchesRequired; // 用来指定手势处理器只处理几个手指的触摸时间
② UIPinchGestureRecognizer : 用来处理用户的捏合手势
@property (nonatomic) CGFloat scale; // 可以获取用户捏合手势的比例
@property (nonatomic,readonly) CGFloat velocity; // 可以获取用户捏合手势时的速度
③ UIRotationGestureRecognizer : 用来处理用户的旋转手势
@property (nonatomic) CGFloat rotation; // 可以获取用户旋转手势的角度
@property (nonatomic,readonly) CGFloat velocity; // 可以获取用户旋转手势的速度
④ UISwipeGestureRecognizer : 用来处理用户的滑动(或轻扫)手势
@property(nonatomic) NSUInteger numberOfTouchesRequired; // 用来指定手势处理器只处理几个手指的触摸时间
@property(nonatomic) UISwipeGestureRecognizerDirection direction; // 用来设置手势处理器处理用户轻扫的方向
// 轻扫手势的方向:
typedef NS_OPTIONS(NSUInteger, UISwipeGestureRecognizerDirection) {
UISwipeGestureRecognizerDirectionRight = 1 << 0, // 向右轻扫(或滑动)
UISwipeGestureRecognizerDirectionLeft = 1 << 1, // 向左轻扫(或滑动)
UISwipeGestureRecognizerDirectionUp = 1 << 2, // 向上轻扫(或滑动)
UISwipeGestureRecognizerDirectionDown = 1 << 3 // 向下轻扫(或滑动)
};
⑤ UIPanGestureRecognizer : 用来处理用户的拖动手势
@property (nonatomic) NSUInteger minimumNumberOfTouches; // 该属性可以设置拖动手势处理器最多支持几个手指一起拖动
@property (nonatomic) NSUInteger maximumNumberOfTouches; // 设置拖动手势处理器最少需要几个手指一起移动
- (CGPoint)translationInView:(nullable UIView *)view; // 该方法可以获取到拖动手势在UI控件上的位移,返回坐标点(x, y )
- (CGPoint)velocityInView:(nullable UIView *)view;// 可以获取到拖动手势在UI空间上的拖动速度,同样也是返回(x, y),但是 X : 水平方向的速度 Y : 垂直方向上的速度
⑥ UILongPressGestureRecognizer : 用来处理用户的长按手势
@property (nonatomic) NSUInteger numberOfTapsRequired; // 该属性用来指定手势处理器只处理几次触摸事件
@property (nonatomic) NSUInteger numberOfTouchesRequired; // 指定用户必须用几个手指在屏幕上长按才能够触发该手势
@property (nonatomic) CFTimeInterval minimumPressDuration; // 指定用户至少在屏幕上按下多久才会触发该长按手势(默认值为: 0.5)
@property (nonatomic) CGFloat allowableMovement; // 用来指定该长按手势允许用户的手指移动的最大距离,如果一旦超过该距离,该长按手势将会失效
⑥ 自定义手势
自定义手势继承:UIGestureRecognizer,实现下面的方法:
– touchesBegan:withEvent:
– touchesMoved:withEvent:
– touchesEnded:withEvent:
- touchesCancelled:withEvent:
5.手势的依赖性
在viewDidLoad的循环里添加这段代码:
[tapRecognizer requireGestureRecognizerToFail:panGestureRecognizer];
意思就是,当如果pan手势失败,就是没发生拖动,才会出发tap手势。这样如果你有轻微的拖动,那就是pan手势发生了。
6.手势代理方法
1. 是否允许同时支持多个手势,默认只支持一个手势,要调用此方法注意设置代理
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
2.是否允许开始触发手势
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
return NO;
}
3.是否允许接收手机的触摸(可以控制触摸的范围)
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
//获取当前的触摸点
CGPoint currentP = [touch locationInView:self.imageView];
在图片的左半区域可以接受触摸
if (currentP.x < self.imageView.bounds.size.width * 0.5) {
return YES;
}else {
return NO;
}
下面这个两个方法也是用来控制手势的互斥执行的
4.这个方法返回YES,第一个手势和第二个互斥时,第一个会失效
- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizershouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer*)otherGestureRecognizer
调用时机同上
5.这个方法返回YES,第一个和第二个互斥时,第二个会失效
- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizershouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer*)otherGestureRecognizer