zoukankan      html  css  js  c++  java
  • iOS开发触摸事件的传递

    1. iOS中的三种事件类型 触摸事件、加速计事件、远程事件。

    触摸事件:通过触摸、手势进行触发(例如手指点击、缩放)

    加速计事件:通过加速器进行触发(例如手机晃动,典型应用是微信摇一摇)

    远程事件:通过其他远程设备触发(例如耳机控制按钮)

    触摸事件的实现方法有四种,touchBegin/touchesMoved/touchesEnded/touchesCancelled

    2. 触摸事件的传递

      要想响应触摸事件必须得有一个前提,就是该对象必须是响应者对象,继承了UIResponder的对象就是响应者对象,只有响应者对象才能够接收并处理事件

    (1)事件是怎么的产生和传递"

    ①.当手指触摸屏幕后会产生 '触摸事件', 然后将事件加入UIApplication的管理事件队列中

    ②.UIApplication会取出事件队列中 '最前面的事件' 分发下去,事先分发给应用程序的主窗口中 'keyWindow'

    ③.主窗口接收到事件后,分发给自己的子控件,寻找最适合的接收事件的控件

    ④.找到 '最适合' 接收的控件后,调用控件的touchesBegin/touchesMoved/touchesEnded方法

    "2、如何找到最合适的控件来处理事件?"

    ①.判断自己是否能接收触摸事件?

      /*

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

       1> 不接收用户交互 userInteractionEnabled=NO

       2> 隐藏 hidden = YES

       3> 透明 alpha = 0.0 ~ 0.01

       */

    ②.判断触摸点是否在自己身上?

       /*

        * 判断触摸点在不在自己身上,view有一个方法【-(BOOL)pointInside:withEvent:】

        * 返回NO,就代表不在自己身边上,那不再遍历子控件

        * 返回YES,代表点在自己向上,那继续遍历子控件

        */

    ③.从后往前遍历子控件,重复前面的两个步骤

    ④.如果没有符合条件的子控件,那么就自己最适合处理的控件

    ⑤.找到最适合的控件后就调用touchesBegin/touchesMoved/touchesEnded方法

     (2)响应者链条

    "什么是响应者链条"

    ①.由多个响应者对象连接起来的链条叫做响应者链条

    ②.什么是上一个响应者?

       >如果当前这个view是控制器的view,控制器就是上一个响应者

       >如果当前这个view不是控制器的view,那么父控件就是上一个响应者

    ③.利用响应者链条可以让多个控件处理同一个 "触摸事件"

       "怎么让多个控件处理同一个 ‘触摸事件’ 事件?"

       >在最后适合的控件里调用super的touchesBegan方法,这样就将事件传给上一个响应,上一个响应者也可以处理事件了

    "3、小结:事件的完整处理过程"

    ①.先将事件对象由上往下传递(由父控制传给子控件),找到最适合的控件来处理

    ②.调用最合适的控件的touches...方法

    ③.如果调用了[super touch…],就会将事件顺着响应都链往上传递,传递给上一个响应者

    ④.接着上一个响应者就会调用的touches...方法

    ⑤.如果没有找到最适合的控件来处理事件,则将事件传回来窗口,窗口不处理事件,将事件传给UIApplication

    ⑥.如果Applicatoin不能处理事件,则将其丢弃

  • 相关阅读:
    模板之st表
    codevs 1163 访问艺术馆
    noip提高组2000 乘积最大
    [HNOI2008]越狱(luogu P3197)
    [ZJOI2009]假期的宿舍(luogu P2055)
    noip普及组2013 车站分级(luogu P1983)
    [HNOI2010]平面图判定
    sql中对于case when...then...else...end的写法和理解
    java中,去除空白的方法
    关于debug时的一些操作
  • 原文地址:https://www.cnblogs.com/xiaofei993/p/5344995.html
Copyright © 2011-2022 走看看