iOS-CALayer中position與anchorPoint詳解
屬性介紹
CALayer通過四個屬性來確定大小和位置, 分別為:frame
、bounds
、position
、anchorPoint
。
下面分別對這是個屬性進行介紹:
frame
@property CGRect frame;
此屬性和view中的frame屬性相同.
-
X,Y
表示subLayer左上角相對於supLayer左上角的位置關係.(與layer的錨點沒有關係,始終是左上角的位置關係) -
width, height
表示subLayer的寬度和高度
bounds
@property CGRect bounds;
此屬性和view中的bounds屬性相同.(將frame屬性中的x,y
設定為0, 即是bounds屬性)
-
X,Y
為0 -
width, height
表示subLayer的寬度和高度
anchorPoint
anchorPoint點(錨點)的值是用相對bounds的比例值來確定的. 例如(0,0), (1,1)分別表示左上角、右下角,依此類推.
錨點都是對於自身來講的. 確定自身的錨點,通常用於做相對的tranform變換.當然也可以用來確定位置.
例如下圖,為不同錨點下做旋轉變化的例子
position
在layer體系結構中, layer需要新增在supLayer中,才可以顯示出來(和view體系結構相似). 因此,每一個顯示出來的layer都有一個supLayer.
position是layer中的anchorPoint點在superLayer中的位置座標.
anchorPoint、position、frame之間的相對關係.
首先弄清楚這三個屬性表示什麼. 回顧一下上面講的.
- frame中的X,Y表示sublayer左上角相對於supLayer的左上角的距離
- position中的X,Y表示sublay錨點相對於supLayer的左上角的距離
- anchorPoint中的X,Y表示錨點的x,y的相對距離比例值
當確定錨點,改變frame時, position的值為:
position.x = frame.origin.x + anchorPoint.x * bounds.size.width;
position.y = frame.origin.y + anchorPoint.y * bounds.size.height;
確定錨點, 改變position時, frame的值為:
frame.origin.x = position.x - anchorPoint.x * bounds.size.width;
frame.origin.y = position.y - anchorPoint.y * bounds.size.height;
改變錨點, frame的值變化為
frame.origin.x = - anchorPoint.x * bounds.size.width + position.x;
frame.origin.y = - anchorPoint.y * bounds.size.height + position.y;
影響關係
- 錨點改變, position不影響, frame變化
- frame變化, 錨點不影響, position變化
- position變化, 錨點不影響, frame變化