响应者 事件传递 导航条 tabbar iOS Developer

hitTest创建一片无法被点击的区域

2015-12-24  本文已影响187人  dose_爽

不废话,先上图

被置灰的按钮,点击按钮的时候self也不会触发touch方法

很明显这样的逻辑违背了所谓的响应者链的模式,被置灰的按钮,设置enabled为NO,那么这个按钮实际上就已经脱离了响应者链的事件处理流程,那么它就需要将事件反映到上一级,在这里也就是self,这个好难啊,初学者太痛苦。

鉴于这个思路,我会想能不能在touch的生命周期内做点文章,后来一想,都到了touch:began这了,还玩个毛,于是查询相关文章,老大推荐下,让我用hitTest:试一下,于是进行了苦逼的hitTest学习之旅。

刚开始看到方法的时候并不知道怎么使用,但我感觉,解决方法的方式肯定就是在


- (nullableUIView*)hitTest:(CGPoint)point withEvent:(nullableUIEvent*)event;// recursively calls -pointInside:withEvent:. point is in the receiver's coordinate system

- (BOOL)pointInside:(CGPoint)point withEvent:(nullableUIEvent*)event;// default returns YES if point is in bounds


这两个方法当中,了解到分发机制的一些内容,我在hitTest,和touch:began中设置断点,我才发现,hitTest就是解决问题的关键,它总是在touch被出发之前调用,是hitTest的返回值来确定能否被响应处理,返回nil的时候就是无法响应,返回的UIView来执行响应的内容,我觉得我好像有思路了,但我还在想如何确定我要点击的区域啊,于是CGRectContainsPoint(CGRect, point),这个方法返回值为bool类型,我相信大家应该知道怎么做了吧,在老大的建议下做了好多的修改,现在把最终的代码贴一下吧。


- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event

{

UIView*hitView = [super  hitTest:pointwith  Event:event];

if(hitView ==self&&CGRectContainsPoint(CGRect, point)) {

                return self;

}else  if(hitView ==self&& !CGRectContainsPoint(CGRect, point)) {

               return   nil;

}else{

            return  hitView;

}

}


其实我刚开始写的好垃圾啊,老大直接就说,你看来还是没太懂分发机制啊T_T,这个是在他教导之下改好的,UIView*hitView = [super  hitTest:pointwith  Event:event]; 调用父类的方法,我就不说了,返回的hitView就是当前点击的由响应链给出的响应对象,他的精髓在于之后的逻辑判断,少量的代码,解决了页面存在多个UIcontrol,但是却互不影响的状况,hitView ==self,已服。。。。。。。。在这里小小的自豪一下,他给我写的还是有bug,但是最终版还是自己完成的,但是思路却是人家给的,唉,但是此处还是应有掌声啊。

第一次写,对于超不会写作文的我,已经尽力,初学者,不正确还望指正。

大神的想法

上一篇下一篇

猜你喜欢

热点阅读