苹果开发,iOS开发,MacOS开发,Android开发,Windows开发

ios view点击事件穿透和改变

2020-03-16  本文已影响0人  yycache

先简单理解一下用户点击屏幕后的事件传递,UIApplication

先响应事件,然后传递给UIWindow。如果window可以响应。就开始遍历window的subviews。遍历的过程中,如果第一个遍历的view1可以响应,那就遍历这个view1的subviews(依次这样不停地查找,直至查找到合适的响应事件view)。如果view1不可以响应,那就开始对view2进行判断和子视图的遍历。依次类推view3,view4……

如果最后没有找到合适的响应view,这个消息就会被抛弃。(整个遍历的过程就是树的先序遍历)。下面是使用情况

1.视图覆盖的情况 想要透过上层视图的响应事件 响应下面的事件

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

UIView *hitView = [super hitTest:point withEvent:event];

if(hitView == 上层视图view){

return 想要响应的下层视图view;

}

return hitView;

}

2.视图覆盖 但是不想要响应上层视图view事件

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

UIView *hitView = [super hitTest:point withEvent:event];

if(hitView == 不想要响应视图的view){

return nil; // 此处返回空即不相应任何事件

}

return hitView;

}

3.让超出父视图范围的子视图响应事件

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

    UIView *view = [super hitTest:point withEvent:event];

    if (view == nil) {

        for (UIView *subView in self.subviews) {

            CGPoint tp = [subView convertPoint:point fromView:self];

            if (CGRectContainsPoint(subView.bounds, tp)) {

                view = subView;

            }

        }

    }

    return view;

}

上一篇下一篇

猜你喜欢

热点阅读