UITouch事件的传递和使用

直接上代码吧,该方法在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;
}
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 16,790评论 4赞 61
  • 本文来自:http://ios.jobbole.com/84081/ 前言: 按照时间顺序,事件的生命周期是这样的...
    HackerOnce阅读 3,006评论 1赞 10
  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 2,785评论 1赞 14
  • 晨读感悟《亲爱的卧底经济学家》蒂姆·哈福德 001要不要办健身卡 就我而言 健身卡是要办的 因为工作时间原因晚上夜...
    不会飞的艳子阅读 186评论 0赞 0
  • 绽放了翅膀 躲不开炙热的焦灼 奄奄一息仿佛被炎热吃掉 一袭夏天的风吹来 所有的人,所有的水树草花 都为之精神抖擞 ...
    伯鱼阅读 287评论 0赞 0

友情链接更多精彩内容