iOS开发 - 响应者链触摸事件(二)
2016-01-22 16:43
363 查看
原文链接
事件处理的事件传递
简介:
发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件 队列中,UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口(keyWindow)UIView不接受触摸事件的三种情况:
不接收用户交互userInteractionEnabled = NO
隐藏
hidden = YES
透明
alpha = 0.0 ~ 0.01
提示:UIImageView的userInteractionEnabled默认就是NO,因此UIImageView以及它的子控件默认是不能接收触摸事件的
事件传递的详细过程:
主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件,但是这仅仅是整个事件处理过程的第一步 找到合适的视图控件后,就会调用视图控件的touches方法来作具体的事件处理touchesBegan…
touchesMoved…
touchedEnded… 这些touches方法的默认做法是将事件顺着响应者链条向上传递,将事件交给上一个响应者进行处理
示例:
![](http://www.2cto.com/uploadfile/Collfiles/20150408/2015040808433429.png)
响应者链条
![](http://www.2cto.com/uploadfile/Collfiles/20150408/2015040808433530.png)
事件传递的完整过程
先将事件对象由上往下传递(由父控件传递给子控件),找到最合适的控件来处理这个事件。 调用最合适控件的touches….方法 如果调用了[super touches….];就会将事件顺着响应者链条往上传递,传递给上一个响应者 接着就会调用上一个响应者的touches….方法
如何判断上一个响应者
如果当前这个view是控制器的view,那么控制器就是上一个响应者 如果当前这个view不是控制器的view,那么父控件就是上一个响应者
响应者链条的事件传递过程
如果view是控制器的view,就传递给控制器;如不是,则将其传递给它的父视图 在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理 如果window对象也不处理,则其将事件或消息传递给UIApplication对象 如果UIApplication也不能处理该事件或消息,则将其丢弃注意
为什么用队列管理事件,而不用栈?队列先进先出,能保证先产生的事件先处理。栈先进后出。
相关文章推荐
- iOS 项目目录结构
- iOS开发 - 响应者链触摸事件(一)
- iOS 开发 nib , xib, storyboard 区别
- iOS 友盟分享
- iOS--资料--开源收集
- iOS滑动tableView来改变导航栏的颜色
- [IOS]二维曲线图表
- github上前100的ios项目
- iOS中如何优化Cell中图片的下载性能
- iOS 开发 -- 常见坑(PCH问题)
- IOS启动动画
- iOS毛玻璃(虚化)效果
- 有关于iOS测试证书问题
- iOS怎样导出IPA包
- iOS中全局悬浮按钮,类似IPhone中的AssistiveTouch
- IOS开发知识(九)
- IOS开发知识(八)
- IOS开发知识(七)
- 常用的iOS第三方资源
- iOS Xib 和 storyboard 相关