View的基本概念:
- View是一个UIView的实例,或者UIView子类的实例
- View知道怎么画它自己
- View 可以handle Event,比如:触摸
- View存在在多个View的hierarchy中,在这个hierarchy的root是application的window
View的hierarchy:
每一个application都有一个UIWindow,UIWindow是一个app里面所有View的容器。当app运行的时候,window被创建,在window创建后,你可以添加其他view上去。
当一个view添加到window上,它被叫做window的subview。view也可以被添加subview。一旦view hierarchy被创建,它会画到屏幕上。这个过程可以分为2步:
- 在hierarchy上的每个view,包含window,自己画自己。它把自己画到它的layer上,layer是一个CALayer。你可以想象一个view的layer是一个位图
- 所有view的layer,在屏幕上编辑在一起
一个例子:
像UIButton这些类已经知道如何render他们自己到layer上。比如: 你创建了一个实例UILabel,你告诉他要显示什么text,但是你不需要告诉iOS怎么去画,apple会去负责画出来。
你也可以自定义override func drawRect(rect: CGRect),去告诉iOS怎么去画。
frame定义了View的size和相对于它的superView的位置。由一个CGPoint(x, y)和size(宽和长)决定。而bounds,继承于UIView,是一个方形,定义了view画自己的区域。每一个view都有一个坐标系统,bounds是一个view的方型在view自己的坐标系统里面。而frame的坐标系统时相对于他的superview的。view总是方形的。
为什么有了frame还要有bounds?
因为他们有他们各自清楚的目的,frame用在编辑阶段,所有的view会被编辑在一起。
frame用在render阶段,把view画出来。
frame和bounds对比图如下:
在window上显示一个view:
let firstFrame = CGRectMake(160, 240, 100, 150)
var firstView:BNRView = BNRView(frame:firstFrame)
firstView.backgroundColor = UIColor.redColor()
self.window!.addSubview(firstView)
self.window?.backgroundColor = UIColor.whiteColor()
self.window?.makeKeyAndVisible()
在iOS编程里面,都是用point,而不是pixel。这样Retina和non-retina的屏可以用同样的布局。point和pixel的换算:
- Retina: 一个pixel = 半个point
- non-Retina: 一个pixel = 一个point