美文网首页
bound、frame、position、anchorPoint

bound、frame、position、anchorPoint

作者: 康小曹 | 来源:发表于2021-01-04 18:18 被阅读0次

    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三者的优先级:

    1. 优先级上:anchor > position ≈ origin;
    2. position 和 origin 的关系为:后确定者影响先确定者;
    3. 约等于的的含义:anchor 不变时,position 和 origin 优先级平行,遵循规则 2,anchor 改变时,优先改变 origin;

    由此,得出几个结论:

    1. 改变 frame 时,position 发生改变;
    2. 改变 position 时,origin 发生改变;
    3. 改变 anchor 时,origin 发生改变;

    示例1:

    改变frame

    上图中,position 先设置,frame 设置之后,position 就发生了改变;

    示例2:


    改变position

    如果先改变 frame,再改变 position,如上图,origin 发生了改变;

    示例3:

    anchor变化

    现象:


    错误理解:

    position = (0,0),anchor = (0,0),那么红色 Layer 的原点应该和黄色 Layer 的圆点重叠啊,这是不是出问题了?

    这个示例里面,其实分为两步:

    1. anchor(0.5,0.5) + position(0,0),此时设置 frame;

    此时,frame 改变,origin 随之改变,就影响到了 position,导致 position 变成 (100,100);

    1. 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;
    

    总结

    1. anchorPoint:锚定之点,和 position 一起使用;
    2. position:锚点在父视图中的坐标;
    3. origin:原点在父视图中的坐标;
    4. bounds:只设置 size,不设置 origin;
    5. frame:既设置 size,也设置 origin;
    6. 上述概念一起构成了 iOS 中的坐标系体系。origin、anchorPoint、position 三者是一个整体,共同决定自身在父视图中的位置。视图大小由 size 控制,而 bounds 只改变 size;
    7. 优先级:anchorPoint > position ≈ origin;
    8. anchorPoint 默认 (0.5,0.5),position 默认 (0,0);

    相关文章

      网友评论

          本文标题:bound、frame、position、anchorPoint

          本文链接:https://www.haomeiwen.com/subject/lazloktx.html