- - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
* 这个方法先于touchesBegan:withEvent:执行
* 点击按钮如果处于手势区域,这个方法也会执行到,但是最终是按钮执行响应
* 如果一个view添加了Tap手势,那在它的所有子视图上的点击都会执行这个方法,如果是按钮则由按钮执行响应,如果子view是手势则由子view执行响应
- - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer
* 如果希望子view上的手势响应后,父view的手势也响应,则该方法return Yes,默认为NO
- - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
* 如果父子手势都收到touch事件,该方法return Yes表示第二个优先
- - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
* 如果父子手势都收到touch事件,该方法return Yes表示第一个优先
- 作为父视图需要考虑哪些
* 在没有被子视图绊掉的情况下,通过开启同时,并绊其他,来获取处理权
- 作为子视图需要考虑哪些
* 非自己需要处理的手势传递出去 - 绊自己
* 子视图只想自己处理 - 绊其他
* 子视图不要随意开启同时,pan手势除外(有时需要全局滑动返回)
- 首先需要知道事件响应的顺序,对于UIButton,UISlider,UISwitch等继承自UIControl的控件,都会率先响应事件,从而阻止了手势事件。手势也可以理解为一种特殊的层,所以在同一个View添加多个Tap手势,则执行最后一个Tap手势,对于TableView,Collection这样的弱点击事件,系统优先响应Tap事件
- hitTest:withEvent 不接收触摸事件的三种情况
(1)不接收用户交互 userInteractionEnabled = NO
(2)隐藏 hidden = YES
(3)透明 alpha = 0.0 ~ 0.01
- hitTest和pointInside
很多情况下hitTest和pointInside方法任选其一都可以实现某个功能,比如在屏蔽中,pointInside返回NO可以实现的话,都可以用hitTest返回nil代替。
但是,hitTest更强大。因为pointInside在一般情况下其内部顶多只能根据情况判断怎么返回NO,屏蔽掉自己和子控件的事件响应。