iOS学习笔记06-手势识别

作者: 执着丶执念 | 来源:发表于2016-03-25 12:28 被阅读447次

    一、UIGestureRecognizer简单介绍

    我们已经学习了触摸事件处理,但触摸事件处理起来很麻烦,每个触摸事件处理都需要实现3个touches方法,比较繁琐,实际上我们可以使用更加简单的触摸事件处理操作,那就是 手势识别UIGestureRecognizer

    手势识别操作基类UIGestureRecognizer不能直接使用,我们常使用的是它的子类,这些手势操作类都继承自UIGestureRecognizer

    常用手势识别子类:
    • 点按手势 UITapGestureRecognizer
    • 捏合手势 UIPinchGestureRecognizer
    • 拖动手势 UIPanGestureRecognizer
    • 轻扫手势 UISwipeGestureRecognizer【4个方向分离】
    • 旋转手势 UIRotationGestureRecognizer
    • 长按手势 UILongPressGestureRecognizer

    二、UIGestureRecognizer属性

    对象属性:
    @property (nonatomic , readonly) UIGestureRecognizerState state;/*< 手势状态 */
    @property (nonatomic , getter=isEnabled) BOOL enabled;/*< 手势是否可用 */
    @property (nonatomic , readonly) UIView *view;/*< 触发手势的视图 */
    @property (nonatomic , assign) BOOL delaysTouchesBegan;/*< 手势识别失败前不执行触摸开始事件,默认为NO */
    
    手势识别状态state:
    typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
        UIGestureRecognizerStatePossible,   // 尚未识别是何种手势操作(但可能已经触发了触摸事件),默认状态
        UIGestureRecognizerStateBegan,      // 手势已经开始,此时已经被识别,但是这个过程中可能发生变化,手势操作尚未完成
        UIGestureRecognizerStateChanged,    // 手势状态发生转变
        UIGestureRecognizerStateEnded,      // 手势识别操作完成(此时已经松开手指)
        UIGestureRecognizerStateCancelled,  // 手势被取消,恢复到默认状态
        UIGestureRecognizerStateFailed,     // 手势识别失败,恢复到默认状态
        UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded // 手势识别完成,同UIGestureRecognizerStateEnded
    };
    
    左图为 **短手势** 的状态转变,右图为 **长手势** 的状态转变

    三、UIGestureRecognizer方法

    #pragmX mark 添加触摸执行事件
    - (void)addTarget:(id)target action:(SEL)action;
    #pragma mark 移除触摸执行事件
    - (void)removeTarget:(id)target action:(SEL)action;
    #pragma mark 触摸点的个数(同时触摸的手指数)
    - (NSUInteger)numberOfTouches;
    #pragma mark 在指定视图中的相对位置
    - (CGPoint)locationInView:(UIView*)view;
    #pragma mark 触摸点相对于指定视图的位置
    - (CGPoint)locationOfTouch:(NSUInteger)touchIndex inView:(UIView*)view;
    #pragma mark 指定一个手势需要另一个手势执行失败才会执行
    - (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer;
    

    四、UIGestureRecognizer使用

    # 创建手势识别器对象
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
    # 设置手势识别器对象的具体属性
    tap.numberOfTapsRequired = 2;  // 连续敲击2次 
    tap.numberOfTouchesRequired = 2;// 需要2根手指一起敲击  
    # 添加手势识别器到对应的view上
    [self.myView addGestureRecognizer:tap]; 
    # 监听手势的触发
    [tap addTarget:self action:@selector(tapView:)]; 
    

    五、多手势冲突

    在iOS中,如果一个手势A的识别部分是另一个手势B的子部分,默认情况下A就会先识别,B就无法识别了,

    比如拖动手势A和轻扫手势B,轻扫手势只在手势结束状态才能执行,而拖动手势在手势开始的时候执行,这两个手势一起触发,轻扫手势就成了牺牲品。

    解决手势冲突,就是利用一个方法:
    -(void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer
    该方法指定一个手势需要另外一个手势识别失败才会执行

    比如解决拖动手势和轻扫手势冲突:
    // 拖动手势的执行需要右轻扫手势的失败为前提
    [panGesture requireGestureRecognizerToFail:swipeGestureToRight];
    // 拖动手势的执行需要左轻扫手势的失败为前提
    [panGesture requireGestureRecognizerToFail:swipeGestureToLeft];
    

    六、UIGestureRecognizerDelegate代理

    代理方法:
    #pragma mark 一个控件识别手势后是否沿着响应者链条继续传播手势识别,默认返回NO
    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
    

    用该代理方法可以实现两个不同控件的手势同时执行,需要让该方法返回YES,手势识别就能传递给不同控件

    相关文章

      网友评论

      • 优雨:可以 很强势
      • ChiwaiSam:感谢分享,期望更新3DTouch的学习内容。 :blush:
        ChiwaiSam:@执着_执念 学到很多,非常感谢
        执着丶执念:@ChiwaiSam 这个http://www.jianshu.com/p/018d0c226134将3D Touch讲得挺好的,你可以去看下
      • 执着丶执念:如果有不同意见,欢迎大家讨论

      本文标题:iOS学习笔记06-手势识别

      本文链接:https://www.haomeiwen.com/subject/cwarlttx.html