对UIView的hitTest: withEvent: 方法的理解
来源:互联网 发布:淘宝淘宝联盟怎么用法 编辑:程序博客网 时间:2024/05/29 17:49
要理解这两个方法。先了解一下用户触摸屏幕后的事件传递过程。
当用户点击屏幕后,UIApplication 先响应事件,然后传递给UIWindow。如果window可以响应。就开始遍历window的subviews。遍历的过程中,如果第一个遍历的view1可以响应,那就遍历这个view1的subviews(依次这样不停地查找,直至查找到合适的响应事件view)。如果view1不可以响应,那就开始对view2进行判断和子视图的遍历。依次类推view3,view4…… 如果最后没有找到合适的响应view,这个消息就会被抛弃。(整个遍历的过程就是树的先序遍历)。过程如下图:
理解了上面的图后,我们再来看看这两个方法。
为了方便,我们将
- (nullableUIView *)hitTest:(CGPoint)point withEvent:(nullableUIEvent *)event;称为方法A
- (BOOL)pointInside:(CGPoint)point withEvent:(nullableUIEvent *)event;称为方法B
对view进行重写这两个方法后,就会发现,点击屏幕后,首先响应的是方法A;
如果方法A中,我们没有调用父类的这个方法,那就根据这个方法A的返回view,作为响应事件的view。(当然返回nil,就是这个view不响应)
如果方法A中,我们调用了父类的这个方法,也就是
[superhitTest:point withEvent:event];那这个时候系统就要调用方法B;通过这个方法的返回值,来判断当前这个view能不能响应消息。
如果方法B返回的是no,那就不用再去遍历它的子视图。方法A返回的view就是可以响应事件的view。
如果方法B返回的是YES,那就去遍历它的子视图。(就是上图我们描述的那样,找到合适的view返回,如果找不到,那就由方法A返回的view去响应这个事件。)
因此总结下来:
//返回一个view来响应事件 (我们如果不想影响系统的事件传递链,在这个方法内,最好调用父类的这个方法)
- (nullableUIView *)hitTest:(CGPoint)point withEvent:(nullableUIEvent *)event;
//返回的值可以用来判断是否继续遍历子视图(返回的根据是触摸的point是否在view的frame范围内)
- (BOOL)pointInside:(CGPoint)point withEvent:(nullableUIEvent *)event;
- 对UIView的hitTest: withEvent: 方法的理解
- UIView hitTest:withEvent:方法流程
- XMG 重写- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event方法
- hitTest:withEvent:方法流程
- hitTest:withEvent:方法流程
- hitTest:withEvent:方法流程
- hitTest:withEvent:方法流程
- hitTest:withEvent:方法流程
- hitTest:withEvent:方法流程
- hitTest:withEvent:方法流程
- hitTest:withEvent:方法流程
- hitTest:withEvent:方法
- 深入理解iOS API系列(三)UiView事件传递相关函数:pointInside:withEvent:和hittest:withevent:
- [转]hitTest:withEvent:方法…
- 模拟UIView的hitTest:方法和pointInside:方法的实现
- UIView的hitTest:方法和pointInside:方法的实现
- [ios2] UIView的hitTest,pointInside方法详解【转】
- hitTest:withEvent:
- 来几个js的简单算法
- 妹子UI轮播插件中关于用户停止操作重新轮播失效的解决办法
- 1008. 数组元素循环右移问题 (20) python篇
- POJ 2485Highways (又一个Prim最小生成树水题)
- SecureCRT 常用快捷键
- 对UIView的hitTest: withEvent: 方法的理解
- 练习题 No.6 最长公共子序(LCS)-附赠最长公共子串
- Java 字符流操作
- 第四周:( LeetCode417 ) Pacific Atlantic Water Flow(c++)
- JS实现弹出框文字居中
- 实现应用软件能够通过运行窗口打开
- Java抽象类
- 基于C++模板 单链表基本操作
- linux下使用ffmpeg将amr转成mp3