视图的center
属性和图层的position
属性都指定了anchorPoint
相对于父图层的位置。图层的anchorPoint
通过position
来控制它的frame
的位置,你可以认为anchorPoint
是用来移动图层的把柄。
默认来说,anchorPoint
位于图层的中点,所以图层的将会以这个点为中心放置。anchorPoint
属性并没有被UIView接口暴露出来,这也是视图的position
属性被叫做“center”的原因。但是图层的anchorPoint
可以被移动,比如你可以把它置于图层frame
的左上角,于是图层的内容将会向右下角的position
方向移动,而不是居中了。如下图1:
anchorPoint
的效果如下图2:
当anchorPoint
不在中心的时候,的效果如下图3:
frame
frame
是一个派生属性,是根据layer的bounds
,position(center)
,archorPoint
,transform
计算出来的。
当改变bounds
,position(center)
,archorPoint
,transform
当中的任何一个值时,frame
都会发生变化。具体步骤如下:
- 首先根据
bounds
、position(center)
、archorPoint
计算出变换前的frame
。 - 根据变换前的
frame
及transform
计算出变换后的frame
。 - 当变换后的
frame
是一个平行四边形或者不平行与边轴时,返回一个最小的包括变换后的frame
的四个顶点的矩形,这个矩形就是真实的frame
。
当改变frame
时,archorPoint
,transform
不变,bounds
和position(center)
随之改变。具体步骤如下:
- 首先根据
frame
及transform
计算出变换前的frame。 - 根据变换前的
frame
的size
修改bounds
属性。 - 根据变换前的
frame
、archorPoint
修改position(center)
属性。
bounds
通过get和set方法,直接读取layer的bounds
属性。
当改变frame
时,bounds
会改变。
当改变bounds
时,frame
随之改变,原理看frame段落。
center(position)
通过get和set方法,直接读取layer的position
属性。
当改变frame
时,position(center)
会改变。
当改变position(center)
时,frame
随之改变,原理看frame章节。
archorPoint
layer的属性,用于记录坐标变换时坐标系的原点。取值范围(0,0)~(1,1)。(0,0)表示以view的左上角为坐标原点进行坐标变换。(1,1)表示右下角。
当改变frame
时,archorPoint
不变。
当改变archorPoint
时,frame
随之改变,原理看frame章节。
transform(view的transform)
view的transform
属性是直接调用的layer的affineTransform
属性的get和set方法。affineTransform
实际上是一个计算属性,当layer调用affineTransform
的set方法时,实际上是换算为CATransform3D
类型的结构体,赋值给layer的transform
属性。同理调用affineTransform
的get方法时,也是通过layer的transform
属性换算为 CGAffineTransform
返回的。换句话说,view的transform
属性等同于layer的affineTransform
属性,是通过get和set方法取的layer的transform
的值。
当改变frame
时,transform
不变。
当改变transform
时,frame
随之改变,原理看frame章节。