博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分析系统查找第一响应者的过程实现
阅读量:6669 次
发布时间:2019-06-25

本文共 2405 字,大约阅读时间需要 8 分钟。

前言:我们知道,当发生点击事件时,系统通过 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event查找第一响应者。找到之后触发该响应者的UIResponder中的touch方法。

  • 以下分析系统如何实现的,

  • 首先我们观察系统的打印结果,在- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 中添加如下代码
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{    NSLog(@"hit start -- >%ld",self.tag);    UIView *v = [super hitTest:point withEvent:event];    NSLog(@"hit end %ld ->%@",self.tag,v);    return v;}复制代码
  • 打印结果如下
hit start -- >100 hit start -- >101 hit end 101 ->(null) hit start -- >102 hit start -- >104 hit end 104 ->
> hit end 102 ->
> hit end 100 ->
> hit start -- >100 hit start -- >101 hit end 101 ->(null) hit start -- >102 hit start -- >104 hit end 104 ->
> hit end 102 ->
> hit end 100 ->
> 104 ->-[TestView touchesBegan:withEvent:]复制代码
  • 以下是模仿系统实现的方法
- (UIView *)__adHitTest:(CGPoint)point withEvent:(UIEvent *)event{    if (![self pointInside:point withEvent:event]) {        return nil;    }        if (self.userInteractionEnabled == NO) {        return nil;    }        if (self.alpha < 0.01) {        return nil;    }        if (self.hidden == YES) {        return nil;    }        if (self.subviews.count) {                for (NSUInteger i = self.subviews.count; i > 0; i--) {                    UIView *sub = self.subviews[i-1];                        CGPoint p = [self convertPoint:point toView:sub];                        UIView *t = [sub hitTest:p withEvent:event];                        if (t != nil) {                return t;            }        }    }        return self;}复制代码
  • - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event换成模仿的实现
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{    NSLog(@"hit start -- >%ld",self.tag);    UIView *v = [self __adHitTest:point withEvent:event];    NSLog(@"hit end %ld ->%@",self.tag,v);    return v;}复制代码
  • 观察模仿后的打印结果
hit start -- >100  hit start -- >101  hit end 101 ->(null)  hit start -- >102  hit start -- >104  hit end 104 ->
> hit end 102 ->
> hit end 100 ->
> hit start -- >100 hit start -- >101 hit end 101 ->(null) hit start -- >102 hit start -- >104 hit end 104 ->
> hit end 102 ->
> hit end 100 ->
> 104 ->-[TestView touchesBegan:withEvent:]复制代码

###是不是差不多?

转载地址:http://milxo.baihongyu.com/

你可能感兴趣的文章
R.I.P. PK
查看>>
今日晚餐:姹紫嫣红阳春面
查看>>
【转载】使用铁哥SmartFlash快速开发方案:66行代码搞定抽奖程序!
查看>>
Map<key,value>泛型get(key)值为null问题解决
查看>>
ZendFramework学习第一章
查看>>
40种网页小技巧
查看>>
PHP 乱码解决方面
查看>>
在Linux中一个网卡绑定多个IP设定
查看>>
Ural 1519 Formula 1 (插头DP)
查看>>
c++动态链接库函数转换为C#函数
查看>>
Mageia 3 Alpha 2 发布,Mandriva 分支
查看>>
poj3994
查看>>
vim中的复制与粘贴 | WangYan BLog
查看>>
android.database.sqlite.SQLiteException: table TB_READ_PERIOD already exists
查看>>
Nginx 1.2.5 稳定版发布
查看>>
linux 自学系列:linux 文本模式
查看>>
poj1003
查看>>
Spring 表单处理
查看>>
编写用逻辑扇区号读写软盘的中断例程
查看>>
Pentaho Big Data Community Home - Pentaho Big Data - Pentaho Wiki
查看>>