zoukankan      html  css  js  c++  java
  • iOS学习笔记06-手势识别

    一、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,手势识别就能传递给不同控件

  • 相关阅读:
    基于Python的人脸动漫转换
    let 与 var的区别
    【LeetCode】汇总
    【HDU】4632 Palindrome subsequence(回文子串的个数)
    【算法】均匀的生成圆内的随机点
    【LeetCode】725. Split Linked List in Parts
    【LeetCode】445. Add Two Numbers II
    【LeetCode】437. Path Sum III
    【LeetCode】222. Count Complete Tree Nodes
    【LeetCode】124. Binary Tree Maximum Path Sum
  • 原文地址:https://www.cnblogs.com/ming1025/p/6062491.html
Copyright © 2011-2022 走看看