iOS OC技术(二)UIKit(UIView)

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。

这两个的顺序是相反的。

你可能感兴趣的:(iOS OC技术(二)UIKit(UIView))