zoukankan      html  css  js  c++  java
  • iOS的触摸事件

      在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件,我们称其为@''响应者对象''UIApplication,UIViewController,UIView都继承自UIResponder,因此他们都是响应者对象,能够处理事件。

    UIResponder

      UIResponder内部提供了方法来处理事件

    一次完整的触摸过程,会经历3个状态

    UIView的触摸事件处理

    1、开始触摸view,系统会调用view下面的方法:

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;

    2、手指在View上移动,系统会调用下面的方法(随着手指的移动,会持续调用该方法)

    - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;

    3、触摸结束,系统会调用view的下面方法:

    - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;

    4、触摸结束前,某个系统事件(例如电话呼入)会打断触摸过程,系统会自动调用view下面的方法

    - (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;

    四个触摸事件的处理方法中,都有NSSet * touches 和 UIEvent * event 两个参数

    1、一次完整的触摸过程,只会产生一个事件对象,4个触摸方法都是同一event参数

     2、如果两根手指同时触摸一个view,那么view只会调用一次 touchesBegan:withEvent: 方法,touches参数中装着两个UITouch对象;

     3、如果这两根手指一前一后分开触摸同一个view,那么view会分别调用两次 touchesBegan:withEvent:方法, 并且每次调用时的touches参数只包含一个UITouch对象;

     4、根据touches中UITouch个数可以判断出使单点触摸还是多点触摸。

        提示:touches中存放的都是UITouch对象。

    UIView不接收触摸事件的三种情况:

        1> 不接受用户交互 :userInteractionEnable = NO;

        2> 隐藏 :hidden = YES;

        3> 透明:alpha = 0.0 ~ 0.01

    提示:UIImageView的userInteractionEnable默认就是NO,因此UIImageView以及它的子控件默认是不能接收触摸事件的。

    响应者链的事件传递过程:

        1> 如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父视图;

        2> 在视图层次结构最顶级的视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理。

        3> 如果window对象也不处理,则其将事件或消息传递给UIApplication对象;

        4> 如果UIApplication也不能处理该事件或消息,则将其丢弃。

    监听触摸事件的做法

        如果想监听一个view上面的触摸事件,之前的做法是:

        1> 自定义一个view;

        2> 实现view的touches方法,在方法内部实现具体处理代码。

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

        1> 必须得自定义view;

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

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

  • 相关阅读:
    Web scraping tutorials with FMiner
    javascript
    Installing perl and writing your first perl program in Ubuntu
    c++
    sudo apt-get install libfcgi libfcgi-dev
    微信JSApi支付~订单号和微信交易号
    微信JSApi支付~坑和如何填坑
    WebApi系列~安全校验中的防篡改和防复用
    EF架构~CodeFirst自关联表的插入
    实时监控Cat之旅~对请求是否正常结束做监控(分布式的消息树)
  • 原文地址:https://www.cnblogs.com/shifenglin/p/5330087.html
Copyright © 2011-2022 走看看