看iOS核心动画高级技巧里面提到了frame,bounds,center等一堆属性,并且还有专门一节是anchorPoint,梳理下anchorPoint到底是什么。
frame
首先说说效果,layer里面的center叫做position,更改layer的position和anchorPoint都会对frame进行更改(其实更改的是frame的起点origional),但是更改position或者anchorPoint并不会影响另外一个的位置。所以先假设frame其实是根据position、anchorPoint等属性计算出来的一个属性好了。frame在文档中的说明是这样的。
The frame rectangle is position and size of the layer specified in the superlayer’s coordinate space. For layers, the frame rectangle is a computed property that is derived from the values in the bounds, anchorPoint and position properties. When you assign a new value to this property, the layer changes its position and bounds properties to match the rectangle you specified. The values of each coordinate in the rectangle are measured in points.
首先layer的frame是它在superlayer坐标系中的位置,frame是一个根据bounds,anchorPoint,position计算出来的computed property(还有transform,不考虑了就),参考wonderffee大神的的博客frame的计算公式是:
1 | frame.origin.x = position.x - anchorPoint.x * bounds.size.width; |
这就解释了为甚么anchorPoint设置(0,0),整个view的frame会改变,往右下角移动。
贴代码看看效果
1 | -(void)viewDidLoad{ |
默认情况下的位置
打开设置anchorpoint那行以后的样子
可以看到frame的x和y有变化了
anchorPoint
通过frame我们可以对锚点得出一个直观的印象,首先这东西跟计算frame有关。
anchorpoint:锚点,船锚是用来固定船的,保证船的活动半径在⚓️周围,锚点也是这个意思。
anchorpoint就是view在做一些变换时的支点,比如旋转,平移,和缩放。
对于不同的锚点,同一个变换的到的效果也不同。
跑一下这段代码立马看到效果
1 | [UIView animateWithDuration:.5f animations:^{ |
其实很好理解吧对不对…
position
position之前说了是跟view的center是同一个位置,一个layer的bounds是一个矩形,如果把这个矩形往中心无限缩小的话,缩到近似一个点,那个点就是position。
position默认是layer的中心,也就是跟center一样,代表的是该layer在superlayer中的位置。所以position用的也是绝对坐标系。
在上面的例子中改了anchorPoint对position是没有什么影响的,只影响了frame,对center也没有影响,就是frame变了…好啰嗦…
最后总结:position 用来设置CALayer在父层中的位置
anchorPoint 决定着CALayer身上的哪个点会在position属性所指的位置