美文网首页
锚点与位置精简概述

锚点与位置精简概述

作者: 叶子扬 | 来源:发表于2018-01-13 15:42 被阅读0次

    ARKit开发中铺天盖地都是锚点,现在探究2D中锚点的表现,于是就有了这篇文章。。。

    锚点(anchorPoint)和位置(postion)的关系

    position的原始定义:The layer’s position in its superlayer’s coordinate space。
    中文可以理解成为position是layer相对superLayer坐标空间的位置。所以请记住这个结论:position的位置是根据anchorPoint来确定的。即:anchorPoint决定position

    anchorPoint、position、frame之间的关系

    anchorPoint的默认值为 (0.5,0.5),也就是anchorPoint默认在layer的中心点。计算 position的值便可以用下面的公式计算:

    position.x = frame.origin.x + 0.5 * bounds.size.width;  
    position.y = frame.origin.y + 0.5 * bounds.size.height;  
    

    里面的0.5是因为anchorPoint取默认值,更通用的公式应该是:

    position.x = frame.origin.x + anchorPoint.x * bounds.size.width;  
    position.y = frame.origin.y + anchorPoint.y * bounds.size.height; 
    
    如果单方面修改layer的position位置,会对anchorPoint有什么影响呢?修改anchorPoint又如何影响position呢?

    根据代码测试,两者互不影响,受影响的只会是frame.origin。
    所以我们又可以得出今天的第二个结论: anchorPoint和position互不影响,故受影响的只有frame。
    现在又可以得出一个换汤不换药的装逼公式:

    frame.origin.x = position.x - anchorPoint.x * bounds.size.width;  
    frame.origin.y = position.y - anchorPoint.y * bounds.size.height;  
    

    PS:这就解释了为什么修改anchorPoint会移动layer,因为position不受影响,只能是frame.origin做相应的改变,因而会移动layer。

    优化

    在实际情况中,可能还有这样一种需求,我需要修改anchorPoint而不想移动layer,在修改anchorPoint后再重新设置一遍frame就可以达到目的,这时position就会自动进行相应的改变。

    代码:

    - (void) setAnchorPoint:(CGPoint)anchorpoint forView:(UIView *)view{
      CGRect oldFrame = view.frame;
      view.layer.anchorPoint = anchorpoint;
      view.frame = oldFrame;
    }
    

    总结

    1、position是layer中的anchorPoint在superLayer中的位置坐标。
    2、互不影响原则:单独修改position与anchorPoint中任何一个属性都不影响另一个属性。
    3、frame、position与anchorPoint有以下关系:

    frame.origin.x = position.x - anchorPoint.x * bounds.size.width;  
    frame.origin.y = position.y - anchorPoint.y * bounds.size.height;
    

    ps:这个作者很有独立性并且付诸行动
    本文是原文的浓缩精简版,原文图文并茂 形象生动

    相关文章

      网友评论

          本文标题:锚点与位置精简概述

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