圖層幾何學
布局
-
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
注意:
當改變了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也能夠做到,但是最好不要這樣,因為浮點類型四舍五入的計算可能會造成一些不便的麻煩。