frame、position、anchorPoint
position 官方文档的解释如下:
The position in the superlayer that the anchor point of the layer's
bounds rect is aligned to. Defaults to the zero point. Animatable.
即:position 表示子视图的锚点在父视图的坐标;
这里就引出了锚点的概念,锚点就不详细解释了,大概就是用点 point(0 ~ 1,0 ~ 1) 来表示视图自身的某一个具体位置。
size 表示尺寸,而 anchor + position + origin 互相影响最终决定子视图在父视图中的位置,而 origin 就是位置的最终承载者。所以,这两者的改变必定影响到子视图在父视图上的位置,也就是原点(orgin)。
先出结论,position、anchor、origin三者的优先级:
- 优先级上:anchor > position ≈ origin;
- position 和 origin 的关系为:后确定者影响先确定者;
- 约等于的的含义:anchor 不变时,position 和 origin 优先级平行,遵循规则 2,anchor 改变时,优先改变 origin;
由此,得出几个结论:
- 改变 frame 时,position 发生改变;
- 改变 position 时,origin 发生改变;
- 改变 anchor 时,origin 发生改变;
示例1:
改变frame上图中,position 先设置,frame 设置之后,position 就发生了改变;
示例2:
改变position
如果先改变 frame,再改变 position,如上图,origin 发生了改变;
示例3:
anchor变化现象:
错误理解:
position = (0,0),anchor = (0,0),那么红色 Layer 的原点应该和黄色 Layer 的圆点重叠啊,这是不是出问题了?
这个示例里面,其实分为两步:
- anchor(0.5,0.5) + position(0,0),此时设置 frame;
此时,frame 改变,origin 随之改变,就影响到了 position,导致 position 变成 (100,100);
- anchor(0.5,0.5) -> anchor(0,0);
anchor 改变时,优先影响 origin 。而实际 position = (100,100),而不是 (0,0),所以 origin 变成 (100,100),最终导致红色 Layer 的原点和 黄色 Layer 上的 (100,100) 重合;
bounds
相对于 frame 而言,bound 比较单纯,就是设置尺寸,也就是 size,本质就是不影响 origin;
所以,如果是只设置了 bounds,而不是 frame,相当于没有设置 origin。此时,origin、position、anchor 中,三个优先级最低就是 origin,所以会优先去改变 origin。现象就是视图的圆点并不是(0,0)。例如,使用 bounds 初始化:
UIView *v = [[UIView alloc] init];
v.backgroundColor = [UIColor systemPinkColor];
v.bounds = self.view.bounds;
[self.view addSubview:v];
结果:
image.png
因为 position 默认为 (0,0),anchorPoint默认为(0.5,0.5),这意味着红色 view 的中心点和绿色view 的原点重合。使用 bounds 设置之后,origin 优先级最低,此时 origin = (-width/2,-height/2)。
让父子视图尺寸一样且重合的正确的设置应该是:
v.frame = self.view.bounds;
总结
- anchorPoint:锚定之点,和 position 一起使用;
- position:锚点在父视图中的坐标;
- origin:原点在父视图中的坐标;
- bounds:只设置 size,不设置 origin;
- frame:既设置 size,也设置 origin;
- 上述概念一起构成了 iOS 中的坐标系体系。origin、anchorPoint、position 三者是一个整体,共同决定自身在父视图中的位置。视图大小由 size 控制,而 bounds 只改变 size;
- 优先级:anchorPoint > position ≈ origin;
- anchorPoint 默认 (0.5,0.5),position 默认 (0,0);
网友评论