iOS-剖析UIView

UIView在iOS中则是在屏幕上用来管理一块矩形区域的对象,也是iOS开发中最为基础的UI控件。

iOS-剖析UIView

UIView看起来很复杂,但是实际上功能却非常的明确:

  • 绘制图案和动画 [CALayer]

    在其矩形范围内,使用UIKit或者Core Graphics来绘制图画。

    某些视图的属性可以设置新的动画状态

  • 布局和子视图管理

    视图可以作为父容器,包含多个子视图

    视图可以调整子视图的大小和坐标

    使用自动布局可以在大小坐标改变时自动适应新变化

  • 内容交互和事件响应 [UIResponder]

    UIView继承自UIResponder,因此UIView具有响应触摸事件的能力

    UIView也可以使用手势管理类来处理常见手势事件

Layer

视图中用于渲染的核心动画层。

声明:
@property(nonatomic, readonly, strong) CALayer *layer;

CALayer直接继承自NSObject,所以它不具备事件能力,只用于绘制内容,而UIView则是Layer的代理,Layer依靠UIView提供的容器显示绘制内容。

常见属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//宽度和高度
@property CGRect bounds;

//位置(默认指中点,具体由anchorPoint决定)
@property CGPoint position;

//锚点(x,y的范围都是0-1),决定了position的含义
@property CGPoint anchorPoint;

//背景颜色(CGColorRef类型)
@property CGColorRef backgroundColor;

//形变属性
@property CATransform3D transform;

//边框颜色(CGColorRef类型)
@property CGColorRef borderColor;

//边框宽度
@property CGFloat borderWidth;

//圆角半径
@property CGFloat cornerRadius;

//内容(比如设置为图片CGImageRef)
@property(retain) id contents;

CALayer 在iOS中等同一个纹理。CALayer中的content属性就指向了一个缓存区,用于放置bitmap。

隐式动画:
同时,每个UIView都有一个rootLayer来显示绘制内容。但是,当对非RootLayer的部分属性进行修改时,默认会自动产生一些动画效果而这些属性称为AnimatableProperties(可动画属性)。

UIResponder

UIResponder是所有事件响应的基石,为整个事件查找过程提供了处理能力, UIView继承自UIResponder, 也就拥有相关的事件处理能力。

1
2
3
4
5
6
7
8
9
10
11
12
13
//常见事件类型
typedef enum {

//多点触摸事件
UIEventTypeTouches,

//行动事件
UIEventTypeMotion,

//远程控制事件
UIEventTypeRemoteControl,

} UIEventType;

事件链

首先是点击View后会产生 Event,Event会向底层传递并被Application接收到后加入事件队列。之后在开始在视图中 自上而下 开始查询

UIWindow接受到事件开始进行最优响应视图查询的过程(逆序遍历subviews,即优先查询后addsubview的子视图)

如果在hitTest & pointInside过程中查询到最优响应视图则后续对于其他subviews遍历查询则会停止

1
2
3
4
5
//判断当前点击事件是否存在最优响应者(First Responder)
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;

//判断当前点击是否在控件的Bounds之内
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;

响应者链

响应者链 其实是由一个个UIResponder的子类构成的,UIResponder是系统一个负责接受和处理事件的类。而 响应者链 就是由最优先响应视图和一系列“下一个响应者”组成。

与查询最优先响应者不同,响应者链是 自下而上 的。

如果最优先响应者能响应处理事件,则传递结束,不能就会传递到下个响应者,通常为视图的SuperView。

但是也有特例,比如比如UIViewController的根视图self.view的nextResponder是其所在UIViewController。而如果UIViewController如果是UIWindow的根控制器,那么它的nextResponder就是UIWindow,但如果UIViewController是另外一个 UIViewController present出来的话,那么它的nextResponder就是之前所执行present操作的那个UIViewController。


总之:

  • 事件分发与传递:自上而下
  • 事件响应:自下而上
iOS-组件化 Apple Push Notification service

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×