博客> 基于UIKit对iOS的事件响应链(hitTest:)使用
基于UIKit对iOS的事件响应链(hitTest:)使用
2019-11-17 01:58 评论:0 阅读:840 lvhahaha
ios事件响应链 hitTest使用 红包雨可点击

上篇文章说明了关于事件响应的处理。主要通过hitTest:返回的view和pointInside,进行view的抓取。最终举荐唯一的对象接收该触碰操作。

1、扩大UIButton 按钮的点击范围。

 屏幕快照 2018-10-25 下午5.48.58.png

二、不规则的按钮点击区域

 屏幕快照 2018-10-25 下午5.32.49.png

现在要设置按钮1的点击区域为上图 自定义button,重写- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event方法

 屏幕快照 2018-10-25 下午5.33.38.png

三、强制指定某视图响应触摸事件:

将截获的对象替换成指定的对象,可以随便替换,只要在替换时你能拿到要替换的对象的实例。穿透scrollView点击scrollView后面的button就是这样做的。可以试试换成一个(hidden=YES、userInteractionEnabled=NO、alpha<0.01)的对象,比较违反直觉,被隐藏\禁用手势的视图一样能响应触摸事件。

经测试,将返回的hit-test view替换为加了手势的view,该view hidden=YES、userInteractionEnabled=NO、alpha<0.01三种情况都可响应事件,但是如果替换为button,并且button的userInteractionEnabled=NO或者enable=NO那么无法响应事件。

四、忽略指定的视图:

在hitTest:withEvent:里筛选返回值,针对指定的对象返回nil

if([view isEqual:XXX]) { return nil; }

这样做的好处是不会阻断hit-testing检测,既可忽略指定的视图又不会屏蔽其子视图。

五、超出父视图范围响应 选定一个节点,遍历他的所有子节点用pointInside:withEvent:判断是否命中,直到找到命中的最低层级的视图,此时我们已经抛弃了系统的hit-testing规则。

 屏幕快照 2018-10-25 下午5.39.25.png  屏幕快照 2018-10-25 下午5.39.38.png

六、ScrollView 嵌套滑动效果

//in scrollView.superView .m  屏幕快照 2018-10-25 下午5.43.31.png

七、关于红包雨的点击。

背景按钮可点,touchView的事件响应和事件处理,巧妙的使用了hitTest的方法,避过了背景button不可点击的难堪地步。并且在touchView上响应的只是红包View。

demo地址:https://github.com/Virtue86/RedPacketForTap

参考:https://www.jianshu.com/p/410ca78faa98

https://www.jianshu.com/p/d8512dff2b3e

http://www.cocoachina.com/ios/20160108/14897.html

https://www.jianshu.com/p/ca3cd5306668

收藏
2
sina weixin mail 回到顶部