UILabel一个简单的文本标签。
它是一种很简单的控件,我们在昨天的按钮之后添加个文本标签。
运行显示:
继承自UIView的,本身不能响应点击事件的,用来展示信息的元素。这类元素使用起来很简单,可以作为其他元素的父视图(或者说盒子),也可以直接展示一些数据或颜色、图形等。
在这里可能产生疑问:本身不响应点击事件,也就是说能够响应点击事件喽。
对的。
根据按钮能够响应点击事件,我们可以猜测,用户点击屏幕,点击的操作,从设备屏幕告诉应用,应用再告诉所点击的元素。
那么具体是怎样实现的呢。
实际开发中,我们能够以各种方式实现普通View的点击响应操作:
1. 添加手势
2. touch响应
3. hitTest方法(注意递归调用,可缓存实现点击相应)
由于篇幅不想过长,具体实现以外链形式展现。
本篇的重点在这里:
下图苹果官方提供的响应链响应方式,我们使用hitTest和touch响应的方法来验证它。
通过重写touchesBegin和hitTest方法,作为监听
我们可以抓到页面层级如下的视图:
它的查找和响应机制如下
上述结果论证了,点击事件的查找方向:Touch->Window->SuperView-> ... -> PointView
而消息的响应,是从 PointView-> ... ->SuperView->ViewController->Window->Application->AppDelegate
即:手触碰屏幕后,先找到窗口,再从窗口一层层子视图找下去,找点点击的目标视图。
而响应的时候,是根据找到的目标视图,判断目标视图是否实现了点击方法,再一层层向上找,最终把消息传递给AppDelegate。
也就是说:从子视图开始,到AppDelegate点击的时候,哪个实现了点击方法,消息就发给谁。
至于什么时候停止,去掉调用父类的方法就停止了(因为子类实现点击方法,不需要父类进行操作了)。
总结:
响应控件的查找是从设备到目标视图。
而iOS内部的控件响应机制是从目标视图到AppDelegate。
这两个的顺序是相反的。