美文网首页
ios事件响应链01

ios事件响应链01

作者: 男人宫 | 来源:发表于2020-03-17 17:20 被阅读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,这样事件就可以正常传递了.

    相关文章

      网友评论

          本文标题:ios事件响应链01

          本文链接:https://www.haomeiwen.com/subject/nhatyhtx.html