• 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的方法的用途。
  • 相关阅读:
    图像旋转与图像缩放及Matlab代码实现
    主成分分析 matlab手把手教操作、SPSS、python实例分析
    直方图均衡化与Matlab代码实现
    kNN算法基本原理与Python代码实践
    MATLAB 均方根误差MSE、两图像的信噪比SNR、峰值信噪比PSNR、结构相似性SSIM
    vue实战——对没见过的东西的科普以及第一次踩坑
    记录关于js模块的浅薄探索(一)——从别人博客中的理解
    js中的同步异步
    webpack踩坑记录(一)
    vue入门(二) ——监听属性,样式绑定
  • 原文地址:https://www.cnblogs.com/goahead-yingjun/p/4864489.html
Copyright © 2020-2023  润新知