frame和bounds的区别

1、frame和bounds的区别

UIView的布局属性包括:frame、bouns、center,分别对应了CALayer中frame、bounds、position。为了能清楚区分,图层用了position,视图用了center,但它们都代表了同样的值。

UIView属性 CALayer属性 属性说明
frame frame 表示相对于其父视图的坐标位置
bounds bounds 表示相对于其自身的坐标位置,{0,0}通常是其左上角
center position 相对于父图层锚点AnchorPoint所在位置
image.png

上图对原有视图做了旋转变换,之后的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.锚点的作用
锚点就相当于一个支点,可以形象的理解为一颗固定了图层的图钉,尤其是我们在做旋转动画时,可能会需要设置此属性来决定图层是围绕哪一个点旋转的。

你可能感兴趣的:(frame和bounds的区别)