目标:现有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; }