视图事件穿透
目标:现有ViewA和ViewB、ViewC。ViewB、ViewC都添加在ViewA上,但是ViewC遮挡了ViewB,ViewC上的处理事件后需要让事件继续传递到ViewB上。例如有一个遮挡层,遮挡层下有一个UITextField控件,点击遮挡层(UITextField范围内),遮挡层需要隐藏,并且UITextField控件会成为第一响应者,键盘弹出。
方案:重新ViewC的hitTest方法
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
//父视图
UIView *view = self.superview;
//点击点在父视图的位置
CGPoint superPoint = [self convertPoint:point toView:view];
//搜索父视图的所有子视图,让子视图能有机会处理该事件
for (UIView *subview in [view.subviews reverseObjectEnumerator]) {
if (subview == self)
continue;
CGPoint convertedPoint = [subview convertPoint:superPoint fromView:view];
UIView *hitTestView = [subview hitTest:convertedPoint withEvent:event];
if (hitTestView) {
[self removeFromSuperview]; //移除掉自身(遮挡层Demo用法)
return hitTestView;
}
}
[self removeFromSuperview]; //移除掉自身(遮挡层Demo用法)
return nil; }
浙公网安备 33010602011771号