iOS事件可以分为3种:
- Touch Events(触摸事件)
- Motion Events(运动事件)
- Remote Events(远程事件,比如用耳机按键控制手机)
下面主要说的是Touch Events(触摸事件),事件整个过程可以分为两个过程:
- 传递:是当我们触摸屏幕时,为我们找出最适合的View
- 响应:当我们找出最适合的View后,此时找到的View并不一定是最适合响应此事件的View,所以需要继续找出能响应此次触摸事件的View。
下图是通过这两个方法寻找最适合的View
func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView?
func point(inside point: CGPoint, with event: UIEvent?) -> Bool
hitTest检测.png
下图是遍历subViews时,是倒叙遍历的,如果找到最适合View时,那么为遍历到的subView不会继续遍历。
检测点击View.png下图是事件响应阶段,响应链。传递阶段与之相反。
事件传递.png
在事件响应过程中,找到最适合的View时,会先判断view.gestureRecognizers属性是否为空,如果不为空,直接响应手势,响应链结束。为空时,判断touches began moved end cancel 四个方法有无实现,如果实现了,那么响应链结束,实现这四个方法。
UIControl之所以可以直接响应事件,是因为它默认实现了touches began moved end cancel 四个方法。
网友评论