zoukankan      html  css  js  c++  java
  • iOS 事件传递和消息处理

    1.事件传递和消息处理

    2.事件分发

    3.touch事件与手势

    4.优质文章

     

    UiView touch事件传递

    产生事件(用户点击)

           |

    寻找响应者(hitTest<--pointIn)

           |

    响应者处理消息(默认结束)

           :

           :

    可根据需要利用响应者链nextResponder将消息向下一个响应者传递。

     
       这个函数的用处是判断当前的点击或者触摸事件的点是否在当前的view中。
       它被hitTest:withEvent:调用(系统UIView实现),通过调用pointInside:withEvent:决定哪个视图来响应此事件。
    1)如果 PointInside:withEvent:返回NO(不在该view内),则hitTest:withEvent:返回nil;
    2)如果 PointInside:withEvent:返回YES,则子视图的继承树就会被遍历(遍历顺序中最先响应的为:与用户最接近的那个视图。 it starts from the top-level subview),即子视图继续调用递归hitTest:withEvent:,直到找到可以响应的子视图(这个子视图的hitTest:withEvent:会返回self,而不是nil),当所有子视图返回nil时该view返回自身作为响应者。
     
        当我们需要重写某个UIView的继承类UIViewInherit的时候,如果需要重写hitTest:withEvent:方法,就会出现是否调用[super hitTest:withEvent:]方法(系统UIView方法,实现对自身子view的遍历行为)的疑问?究竟是否需要都是看具体需求,这里只是说明调与不调的效果。
        如果自身self不调用[super hitTest:withEvent:]方法,那么重写的方法hitTest:withEvent:只会调用重写后的代码,根据所重写的代码返回self或nil,如果返回self那么你的这个UIViewInherit类会接受你的按键,然后调用touches系列方法;否则返回nil那么传递给UIViewInherit类的按键到此为止,它不接受它的父view给它的按键,即不会调用touches系列方法。这时,PointInside:withEvent:几乎没有作用。
        如果自身self调用[super hitTest:withEvent:]方法,那么[super hitTest:withEvent:]方法首先是根据PointInside:withEvent:的返回值决定是否递归调用自身self的所有子View的hitTest:withEvent:方法(系统实现的UIView的该方法的行为)。对于自身self的子View的hitTest:withEvent:方法调用也是一样的过程,这样一直递归下去,直到最先找到的某个递归层次上的子View的hitTest:withEvent:方法返回非nil,这时候,调用即结束,最终会调用这个子View的touches系列方法。
     
         如果我们不想让某个视图响应事件,只需要重载 PointInside:withEvent:方法,让此方法返回NO就行了。不过从这里,还是不能了解到hitTest:WithEvent的方法的用途。
  • 相关阅读:
    有点忙啊
    什么是协程
    HDU 1110 Equipment Box (判断一个大矩形里面能不能放小矩形)
    HDU 1155 Bungee Jumping(物理题,动能公式,弹性势能公式,重力势能公式)
    HDU 1210 Eddy's 洗牌问题(找规律,数学)
    HDU1214 圆桌会议(找规律,数学)
    HDU1215 七夕节(模拟 数学)
    HDU 1216 Assistance Required(暴力打表)
    HDU 1220 Cube(数学,找规律)
    HDU 1221 Rectangle and Circle(判断圆和矩形是不是相交)
  • 原文地址:https://www.cnblogs.com/goahead-yingjun/p/4864489.html
Copyright © 2011-2022 走看看