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,这样事件就可以正常传递了.

上一篇下一篇

猜你喜欢

热点阅读