视图事件穿透

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

 

posted on 2016-12-14 16:46  技术大白  阅读(166)  评论(0编辑  收藏  举报