zoukankan      html  css  js  c++  java
  • IOS 响应者链条 and UIGestureRecognizer 手势识别器)


     一次完整的触摸事件的传递响应的过程
     UIAppliction --> UIWiondw -->递归找到最适合处理事件的控件 控件调用touches方法-->判断是否实现touches方法-->没有实现默认会将事件传递给上一个响应者-->找到上一个响应者
     
     
     1.响应者链条:
     由很多响应者链接在一起组合起来的一个链条称之为响应者链条
     什么是响应者:继承UIResponder的对象称之为响应者对象
     
     2.默认做法是将事件顺着响应者链条向上传递,将事件交给上一个响应者进行处理
     如何判断当前响应者的上一个响应者是谁?
     1.判断当前是否是控制器的View, 如果是控制器的View上一个响应者就是控制器
     2.如果当前不是控制器的View,上一个响应者就是父控件
     
     3.响应者链条有什么用?
     可以让一个触摸事件发生的时候让多个响应者同时响应该事件
     ( 利用响应者链条, 能让多个控件 处理 同一个触摸事件)

    响应者链条示意图

    响应者链的事件传递过程

    • 如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的 父视图
    • 在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或 消息传递给window对象进行处理
    • 如果window对象也不处理,则其将事件或消息传递给UIApplication对象
    • 如果UIApplication也不能处理该事件或消息,则将其丢弃

    监听触摸事件的做法

    • 如果想监听一个view上面的触摸事件,之前的做法是 
      自定义一个view
      实现viewtouches方法,在方法内部实现具体处理代码

      通过touches方法监听view触摸事件,有很明显的几个缺点

      必须得自定义view

      由于是在view内部的touches方法中监听触摸事件,因此默认情况下,无法让其 他外界对象监听view的触摸事件

      不容易区分用户的具体手势行为

      • iOS 3.2之后,苹果推出了手势识别功能(Gesture Recognizer),在触摸事件处理
      方面,大大简化了开发者的开发难度

    UIGestureRecognizer

    • 为了完成手势识别,必须借助于手势识别器----UIGestureRecognizer
    • 利用UIGestureRecognizer,能轻松识别用户在某个view上面做的一些常见手势
    • UIGestureRecognizer是一个抽象类,定义了所有手势的基本行为,使用它的子类才 能处理具体的手势

    UITapGestureRecognizer(敲击)

    UIPinchGestureRecognizer(捏合,用于缩放)

    UIPanGestureRecognizer(拖拽)

    UISwipeGestureRecognizer(轻扫)

    UIRotationGestureRecognizer(旋转)

    UILongPressGestureRecognizer(长按)

     UITapGestureRecognizer(敲击)

    每一个手势识别器的用法都差不多,比如UITapGestureRecognizer的使用步骤如下
            ➢ 创建手势识别器对象
           UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];

    设置手势识别器对象的具体属性
    // 连续敲击2tap.

    numberOfTapsRequired = 2;

    // 需要2根手指一起敲击 tap.

    numberOfTouchesRequired = 2;

    添加手势识别器到对应的view

    [self.iconView addGestureRecognizer:tap];

    监听手势的触发
    [tap addTarget:self action:@selector(tapIconView:)];

    @interface NJViewController ()
    @property (weak, nonatomic) IBOutlet UIImageView *iconView;
    
    @end
    
    @implementation NJViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
       
        // 0 .打开UIImageView的用户交互
        self.iconView.userInteractionEnabled = YES;
         /*
        // 1.创建手势识别器
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
        // 1.1设置手势识别器的属性
        // 设置用户必须点击几次才能出发点击事件
        tap.numberOfTapsRequired = 2;
        // 设置用户必须两根手指同时点击才会促发事件
        tap.numberOfTouchesRequired = 2;
        
        
        // 2.添加手势识别器到view
        [self.iconView addGestureRecognizer:tap];
        
        // 3.监听手势识别器
        [tap addTarget:self action:@selector(tapView)];
         */
        
        [self.iconView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapView)]];
    }
    
    - (void)tapView
    {
        NSLog(@"图片被点击了");
    }
    
    @end
    View Code

    手势识别的状态

    typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {

    // 没有触摸事件发生,所有手势识别的默认状态   UIGestureRecognizerStatePossible,

    // 一个手势已经开始但尚未改变或者完成时    UIGestureRecognizerStateBegan,

    // 手势状态改变                 UIGestureRecognizerStateChanged,

    // 手势完成                   UIGestureRecognizerStateEnded,

    // 手势取消,恢复至Possible状态

     }

  • 相关阅读:
    分层图最短路(DP思想) BZOJ2662 [BeiJing wc2012]冻结
    动态规划 BZOJ1925 地精部落
    线性DP SPOJ Mobile Service
    线性DP codevs2185 最长公共上升子序列
    数位DP POJ3208 Apocalypse Someday
    线性DP POJ3666 Making the Grade
    杨氏矩阵 线性DP? POJ2279 Mr.Young's Picture Permutations
    tarjan强连通分量 洛谷P1262 间谍网络
    树链剖分 BZOJ3589 动态树
    二分图 BZOJ4554 [Tjoi2016&Heoi2016]游戏
  • 原文地址:https://www.cnblogs.com/liuwj/p/6598599.html
Copyright © 2011-2022 走看看