iOS开发中手势相关的学习使用

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、分手势介绍


  1. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值