hitTest
hitTest方法,简而言之,就是给定一个点,返回一个view或layer,判定当前是哪一个view或layer被点中了
原理
当用户触摸屏幕的时候,系统会依次调用view层次中各个子view的hitTest方法,来判断当前是哪个view被点中,决定谁是first responder
默认的实现就是触摸点是否在此view的范围内,开发者可以重写此方法,来实现不同的逻辑。具体来说有2种常见的场景
重写UIView的hitTest方法
比如为了扩大某个view的点击区域,就可以用这个方法
1 | override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { |
如上,通常来说view的hitTest方法不需要手动调用,而是iOS系统在需要的时候调用
重写CALayer的hitTest方法
有时自定义的view包含多个layer,所以当此view被点中的时候,还希望知道具体是哪个layer区域被点中,从而进行不同的处理。这时候可以通过重写layer的hitTest方法进行判断
1 | override func hitTest(p: CGPoint) -> CALayer? { |
与view的hitTest不同的是,layer的hitTest方法通常需要开发者自己调用。比如在自定义的view上绑定了一个UITapGestureRecognizer,并且设置了delegate,那么当tap事件触发之后,就会进入以下方法
1 | override func gestureRecognizerShouldBegin(gr: UIGestureRecognizer) -> Bool |
需要注意,如果view上绑定了多个recognizer,那么每个手势都会触发进入此方法一次。在此方法中,可以手动调用layer的hitTest方法,来判断是哪个layer被点中
1 | override func gestureRecognizerShouldBegin(gr: UIGestureRecognizer) -> Bool { |