iOS --点击事件分发机制

来源:互联网 发布:老贾清弓 淘宝 编辑:程序博客网 时间:2024/06/07 04:41

前言:

iOS点击事件大家都比较熟悉子控件先拦截执行了父控件不执行.子控件不执行给父控件..一直往上边找...可是大家可能理解的都不是特别充分.再跟Android开发讨论的过程中发现他们的响应链和我们不太一样.所以查了写资料.分析记录一下.如有不对.请多指正!

hit-TestView

你要点击触发一个事件是不是得先找到那个响应事件的view .那个View 即为:hit-TestView.那iOS自己是怎么找到这个View的?
1.从视图最底层window开始遍历view
2.每个view 是按照subview的逆序来遍历的
具体解释一下:
例如.window 上有个mainView.
mainView 上有两个View 添加顺序是 subView1 和subView2
subView1 上有一个UIButton btn
subView2 上有一个UILabel leb

如果点击btn找寻hit-TestView调用方法 顺序是:window hitTest方法 --> mainView hitTest方法 --> subView2 hitTest方法(nil) --> subView1 hitTest方法 --> btn hitTest方法 -->找到hit-TestView

具体对于每一个view的实现方法是:

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{    if(self.alpha <= 0.01 || self.userInteractionEnabled || self.hidden){        return nil;//判断自己的透明度.是否能响应以及是否是隐藏    }    if(![self pointInside:point withEvent:event]){        return nil;//判断点是否在自己身上    }    NSEnumerator *enumerator = [self.subviews recerseObjectErumerator];    for(UIView *subview in enumerator){//判断子View        UIView *hitTestView = [subview hitTest:point withEvent:event];//进行父视图的操作        if(hitTestView){            return hitTestView;        }    }    return self;}//这个方法说明了寻找hit-TextView的过程//即从window 一直往下寻找点击的View

说明:
ios 的事件传递就是寻找view的过程 先是产生了触摸事件然后UIAppliction 的事件队列 - > UIWindow 的hit 方法 -> 一级一级从上到下传递找到合适的View;
在一定合适的情况下我们可以重写父视图的hit方法来返回合适的view.

响应链

找到你点击的那个View 一般就开始响应了 但是如果这个view 可以选择处理和不处理..或者交给下一个响应者处理.
一般情况下 这个事件在这个第一响应者的响应之后不会再往下响应了.
也就是说正常情况下 first Responder 如果不处理事件 则将事件交给nextResponder直到有对应的响应者,或者直到传到APPDelegate去
通过上边的介绍得到结论:
知道nextResponder 就能够知道响应链 那view 的nextResponder 都是?

UIView.nextResponder --> view的直接管理者(ViewController 或者superView)UIViewController.nextResponder --> viewController.view.superViewUIWindow.nextResponder --> UIApplicationUIApplication.nextResponder --> AppDelegate//发现 nextResponder 的类型为 UIView UIViewController UIApplication -->都是UIResponder

UIResponder

只有继承他的对象才能处理响应 – >响应者对象
现在主要是说咱们最常用的那个触摸事件.其他的响应以后有机会在分享
UIResponder 对于触摸事件提供了四个方法其他的我也不多说.就说一个我们都见过的我也自己用过的那就是..等等等等:

-(void)touchesBegan:(NSSet<Touch*>*)touches withEvent:(UIEvent *)event{    [super touchesBegan:touches withEvent:event];}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;//在view上移动时调用- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;//手指离开触摸结束调用- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event//触摸被其他事情打断(电话)
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 跳完蛙跳腿疼怎么办 腿受凉了疼怎么办偏方 鸭子步蛙跳后腿疼怎么办 戴墨镜鼻子会红怎么办 校服黑色裙子染色了怎么办 新警培训时怀孕怎么办? 大学生欠了网贷怎么办? 车侧面底盘被刮怎么办 军人家属被打没人处理怎么办 孩子字写的难看怎么办 企业k宝锁死了怎么办 建行信用卡密码忘了怎么办 主卧对着卫生间怎么办 不会画农场的画怎么办 泰迪骨折了怎么办护理 狗狗的腿骨折了怎么办 狗狗摔了一下腿瘸了怎么办 狗狗前腿摔瘸了怎么办 狗摔跤腿瘸了怎么办 小狗的前腿弯了怎么办 两周的小狗缺钙怎么办 狗腿关节断了怎么办 五岁儿童抵抗力差怎么办 3岁儿童抵抗力差怎么办 四岁儿童抵抗力差怎么办 我孩子和我相冲怎么办 儿子不热母亲怎么办?单身呀? 大兔子吃小兔子怎么办 车窗贴膜里面有灰尘怎么办 陌陌小游戏不能玩游戏怎么办 电脑游戏里面的出现俄文怎么办 龙之谷手游转职业装备怎么办 如果函数值和类型不一致怎么办 qq提现不到账怎么办 提现的钱不到账怎么办 联璧金融提现不到账怎么办 孕早期拉稀拉水怎么办 兔子嘴巴摔烂了怎么办 猫咪耳朵里有黑的东西怎么办 兔子的腿骨折了怎么办 德牧耳朵立不起来怎么办