直接上代码吧,该方法在UIView的.m里面
传递方法
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
//判断点击的位置是否在RootView内部
if (![self pointInside:point withEvent:event]) {
return nil;
}
//获取所有的子视图
NSArray *subViews = self.subviews;
//遍历(从后到前)数组,依次判断每一个视图的情况
for (NSInteger i = subViews.count - 1; i >= 0; i--) {
//获取其中一个视图
UIView *view = subViews[i];
//隐藏视图(几乎完全透明的视图)不参与用户事件的分配
if (view.hidden == YES || view.userInteractionEnabled == NO || view.alpha <= 0.001) {
//跳过此视图的判断,直接进行下一个视图的判断
continue;
}
//判断坐标点在不在视图之内
//坐标系转换
CGPoint pointForView = [self convertPoint:point toView:view];
if ([view pointInside:pointForView withEvent:event]) {
//当确定某一子视图接收到事件后,还需要让这个子视图再进行分配
return [view hitTest:pointForView withEvent:event];
}
}
//如果不在任意一个子视图中,则说明由RootView来接受事件
return self;
使用方法
使用响应者链可以找到该视图的navigationcontroller然后跳转进去
- (UINavigationController *)navigationController {
UIResponder *responder = self.nextResponder;
while (responder) {
//NSLog(@"%@", responder);
if ([responder isKindOfClass:[UINavigationController class]]) {
return (UINavigationController *)responder;
}
responder = responder.nextResponder;
}
return nil;
}