ios事件响应链01
2020-03-17 本文已影响0人
男人宫
初学者可参考
先看一张图片
916B00AC-ED79-4A10-956A-C27BEED08A64.png
紫色的是一个view,红色的是一个button放在在view上.正常的情况点击button超出view的部分,button事件是不会触发的.那到因为什么原因呢?那就要说到事件响应者链.
当发生一个触摸事件后,事件的传递是由下而上的:如果正常的话,点击button触发一个事件.事件的传递顺序:UIApplaction->UIWindow->UIViewController->紫色View->红色button.
此例在这个事件传递中,紫色View->红色button这一步出现了错误,事件值传递给了紫色View,并没有再给红色Button传递,因为点击button时触摸点不在紫色View上,所以事件就不再传递了.
通过下面的方法可以验证
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
//若视图响应了则返回该视图,没有响应则返回nil
NSLog(@"%s",__func__);
return [super hitTest:point withEvent:event];
}
上述就是造成按钮没有响应的原因.
!!!假如设计需求本是如此奇葩,那该解决办法?
办法肯定会有的.先直接上代码
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
//转换坐标点,
CGPoint pointTap = [self convertPoint:point toView:_button];
//如果坐标点在_buuton上则返回YES
if ([_button pointInside:pointTap withEvent:event]) {
return YES;
}
NSLog(@"%s",__func__);
return [super pointInside:point withEvent:event];
}
完美解决一些这种问题
就是通过重写紫色View的-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event方法.该方法的作用是判断触摸点是不是在自身坐标系范围内,若在则返回YES,不在返回NO.通过重写,让只要点击了Button就返回YES,这样事件就可以正常传递了.