图层几何学
布局
-
UIView
有三个比较重要的布局属性:frame
,bounds
和center
,CALayer
对应地叫做frame
,bounds
和position
。为了能清楚区分,图层用了“position”,视图用了“center”,但是他们都代表同样的值。
frame
代表了图层的外部坐标(也就是在父图层上占据的空间),bounds
是内部坐标({0, 0}通常是图层的左上角),center
和position
都代表了相对于父图层anchorPoint
所在的位置。
锚点
- 默认来说,
anchorPoint
位于图层的中点,所以图层的将会以这个点为中心放置。anchorPoint
属性并没有被UIView
接口暴露出来,这也是视图的position属性被叫做“center”的原因。但是图层的anchorPoint
可以被移动,比如你可以把它置于图层frame
的左上角,于是图层的内容将会向右下角的position方向移动,而不是居中了。
注意:
当改变了anchorPoint
,position
属性保持固定的值并没有发生改变,但是frame
却移动了。
anchorPoint
用单位坐标来描述,也就是图层的相对坐标,图层左上角是{0, 0},右下角是{1, 1},因此默认坐标是{0.5, 0.5}。anchorPoint
可以通过指定x和y值小于0或者大于1,使它放置在图层范围之外。
坐标系
-
CALayer
给不同坐标系之间的图层转换提供了一些工具类方法
- (CGPoint)convertPoint:(CGPoint)point fromLayer:(CALayer *)layer;
- (CGPoint)convertPoint:(CGPoint)point toLayer:(CALayer *)layer;
- (CGRect)convertRect:(CGRect)rect fromLayer:(CALayer *)layer;
- (CGRect)convertRect:(CGRect)rect toLayer:(CALayer *)layer;
这些方法可以把定义在一个图层坐标系下的点或者矩形转换成另一个图层坐标系下的点或者矩形. -
zPosition
zPosition
属性在大多数情况下其实并不常用。在后面,我们将会涉及CATransform3D
,你会知道如何在三维空间移动和旋转图层,除了做变换之外,zPosition
最实用的功能就是改变图层的显示顺序了。改变视图顺序可以用bringSubViewToFront
通常,图层是根据它们子图层的sublayers
出现的顺序来类绘制的,这就是所谓的画家的算法--就像一个画家在墙上作画--后被绘制上的图层将会遮盖住之前的图层,但是通过增加图层的zPosition
,就可以把图层向用户视角方向前置。其实并不需要增加太多,视图都非常地薄,所以给zPosition
提高一个像素就可以让视图前置,当然0.1或者0.0001也能够做到,但是最好不要这样,因为浮点类型四舍五入的计算可能会造成一些不便的麻烦。