关于 View
- View是UIView(或其子类)的一个实例
- View负责对自己的绘制
- View处理如触摸等事件
- View存在于某个 View Hierarchy,且 View Hierarchy的根为application的window
- View既可以在Interface Builder,也可以在代码中创建
关于 ViewHierarchy
- 当 application启动时,会创建一个UIWindow的实例作为整个 application中所有 view的容器,然后便可以向其中添加其他 View。(在 AppDelegate 中对应为 application:didFinishLaunchingWithOptions:方法)
- 当 view被添加到window中后,它就成为了这个 window的 subview,同时该 view也可以拥有自己的 subview,于是最终便会形成一个由 view组成、window为根的view hierarchy。
- 当 view hierarchy创建完毕后,它将会分为两步被绘制到屏幕上:
- 每个 hierarchy中的 view(包括 window)绘制自己并 return给自己的 layer( layer是 CALayer的实例)。
- 所有的 layer被叠加在一起呈现在屏幕上。
关于 Frame,CGRect, CGPoint
- UIView的 designated initializer是 initWithFrame:,该方法有一个参数类型为 CGRect,赋给该 view的 frame属性,然后生成一个 view的实例。
- View的 frame指明 view的尺寸和 view与其 superview的相对位置。
- CGRect是一个C的结构体,它包含另外两个结构体 CGPoint,分别用为 origin和 size,每个结构体中有 float类型的 x , y两个成员变量。
通过代码产生 view和view hierarchy的一般步骤:
- 通过 CGRectMake方法传入尺寸和相对于 superview的位置坐标,生成一个 CGRect作为 view的frame
- 通过 View的 initWithFrame:方法生成初始化 view实例
- 对该 view实例进行需要的设置(如背景颜色等)
- 将该 view通过其 superview的addSubview方法添加到 hierarchy中
同时会自动将该 view的 superview属性指向该 superview(superview属性为 weak以避免循环引用)
关于 point和 pixels
- 为了兼顾多种分辨率和尺寸,iOS中采用 point描述尺寸和位置,而不是 pixels。
- non-Retina设备(iPhone 2G, 3G, 3GS)
Render @1x即 1 point对应 1 pixel
- Retina设备(iPhone 4, 4s, 5, 5s ,6)
Render @2x即 1 point对应 2 pixel
- Retina设备(iPhone 6 Plus)
Render @3x即 1 point对应 3 pixel
实际在渲染时为 @2.46x,但苹果为了方便开发者故使用 @3x素材,再缩放到@2.46x。
自定义 view的绘制方法(drawRect:)
- drawRect:方法是 view将其自身绘制到 layer上的过程,现有的 UIView均已实现了该方法,例如 UIButton中该方法在 view中间绘制亮蓝色文本,而自定义 view则需要自己覆写该方法。
- 覆写 drawRect:的一般步骤:
- 获取 view的 bounds,bounds是UIView的属性,是描述需要绘制的东西相对于view的尺寸和位置。( frame是描述 view相对于其superview的尺寸和位置)因此若需要一个全屏的 frame可以取 window的 bounds。
- 使用 UIBezierPath 类绘制图形
- 创建 UIBezierPath类的实例
- 为该实例指明绘制的路径(可参见开发者文档)
- 配置该 path实例的属性(如 lineWidth)
- 对画笔进行设置(如stroke的颜色)
- 向该实例发送消息(如 stroke)进行绘制