iOS中,UIApplication管理着一个事件的队列,当系统获取用户的点击或滑动等事件后,就会将这些事件按顺序插入UIApplication管理的这个队里中,UIApplication再从这个队列中取出事件传递给UIWindow,UIWindow传递给它的View,View继续传递给它的子视图。那么系统是如何正确的将这个事件传递到用户操作的视图上呢?

原来每一个UIView都拥有一个名为hitTest的方法,通过这个方法,UIview首先判断自己能接收事件,不能接收事件就不会继续将获取的事件传递给自己的子视图。如果自己能接收事件,UIView就会通过调用pointInside方法判断事件发生的那个点有没有在当前视图上。如果在当前视图上,UIView就会从从后往前遍历自己的子控件,判断有没有比自己更合适的View来接收该事件。

下面让我们来看看hitTest的具体实现过程吧:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    // 判断自己能否接收事件
    if (self.userInteractionEnabled == NO || self.alpha <= 0.01 || self.hidden == YES) {
        return nil;
    }
    
    // 判断点是不是在当前视图上
    if (![self pointInside:point withEvent:event]) {
        return nil;
    }
    
    // 从后往前遍历自己的子控件,寻找更合适的View
    for (long i = self.subviews.count - 1; i >= 0; i--) {
        // 获取子控件
        UIView *childView = self.subviews[i];
        
        // 将自己坐标系的点转化成子控件坐标系的点
        CGPoint childPoint = [self convertPoint:point toView:childView];
        
        // 递归调用hitTest方法,寻找更加合适的View
        UIView *fitView = [childView hitTest:childPoint withEvent:event];
        if (fitView) {
            return fitView;
        }
    }
    
    // 没有找到比自己更适合的View
    return self;
}

最新文章

  1. iOS10 权限崩溃问题
  2. 微信公众平台自动回复wechatlib.jar的生成及wechatlib解析
  3. 【HTML5】canvas画布练习
  4. Yii2 中自定义实例名称
  5. LNMP环境搭建
  6. 重建中国.NET生态系统
  7. JAVA Day2
  8. Vue.js:轻量高效的前端组件化方案(转载)
  9. 牛顿方法(Newton-Raphson Method)
  10. MAC安裝《Genymotion Android模擬器》大玩Android APP (神魔之塔)
  11. Justinmind教程(3)——管理原型
  12. KB奇遇记(4):困难重重的选型
  13. python语言基础汇总
  14. Android 手势锁的实现 让自己的应用更加安全吧
  15. html中设置锚点定位
  16. a dive in react lifecycle
  17. adb入门学习笔记
  18. 设计模式C++学习笔记之九(Template Method模板方法模式)
  19. 机器学习基石笔记:12 Nonlinear Transformation
  20. tomcat支持https的server.xml配置

热门文章

  1. Hibernate操作指南-实体与常用类型的映射以及基本的增删改查(基于注解)
  2. CentOS 7 yum方式配置LAMP环境
  3. LuaSrcDiet工具介绍(lua源码处理软件)
  4. http 登录Digest认证相关知识
  5. 如何用jenkins实现自动化构建新版本和二维码下载
  6. UVALive 7141 BombX(离散化+线段树)(2014 Asia Shanghai Regional Contest)
  7. android 案例二 登录界面
  8. Mysql数据库的使用总结之ERROR 1146 (42S02)
  9. PHPExcel--基本操作
  10. (一)sql入门 导读