您的位置:首页 > 产品设计 > UI/UE

iOS Programming: The Big Nerd Ranch Guide (4th Edition) 阅读笔记-关于View和View Hierarchy

2015-06-05 23:22 696 查看
关于 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)进行绘制
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: