1、frame和bounds的区别
UIView的布局属性包括:frame、bouns、center,分别对应了CALayer中frame、bounds、position。为了能清楚区分,图层用了position,视图用了center,但它们都代表了同样的值。
UIView属性 | CALayer属性 | 属性说明 |
---|---|---|
frame | frame | 表示相对于其父视图的坐标位置 |
bounds | bounds | 表示相对于其自身的坐标位置,{0,0}通常是其左上角 |
center | position | 相对于父图层锚点AnchorPoint所在位置 |
上图对原有视图做了旋转变换,之后的frame实际上代表了覆盖在图层旋转之后的整个轴对齐的矩形区域,此时frame的宽和高和bounds不再一致了。
其实,对于视图和图层来说,frame是根据bounds、position、和transform计算而来的;所以当其中的任何一个值发生变化时,frame就会发生变化,相反改变frame也同样影响他们当中的值。
2、中心点(position)与锚点(anchorPoint)
position是当前layer的anchorPoint在superLayer中的位置。
我们也可以更确切理解为:position是相对于superLayer来讲,而anchorPoint是相对于当前layer来讲;只不过在默认情况下,anchorPoint与position是重合的;锚点是用单位坐标来描述的(即图层的相对坐标),图层的左上角是{0,0},右下角是{1,1},因此图层的默认锚点是{0.5, 0.5},表示图层的中间位置代表了其位置position。
下面的图示是将锚点从{0.5,0.5}改为了{0,0},我们在这里更容易看到position与anchorPoint之间的关系:
image.png
position.x = frame.origin.x + 0.5 * bounds.size.width;
position.y = frame.origin.y + 0.5 * bounds.size.height;
这里的0.5参数,其实就是由于锚点默认值得到的,所以改进公式如下:
position.x = frame.origin.x + anchorPoint.x * bounds.size.width;
position.y = frame.origin.y + anchorPoint.y * bounds.size.height;
修改position与anchorPoint中任何一个属性都不能影响另一个属性,由此我们也可以再次改进公式
frame.origin.x = position.x - anchorPoint.x * bounds.size.width;
frame.origin.y = position.y - anchorPoint.y * bounds.size.height;
最后得出结论:frame的origin坐标由position与anchorPoint来共同决定;
3.锚点的作用
锚点就相当于一个支点,可以形象的理解为一颗固定了图层的图钉,尤其是我们在做旋转动画时,可能会需要设置此属性来决定图层是围绕哪一个点旋转的。
网友评论