美文网首页
影响Layer位置的因素

影响Layer位置的因素

作者: cs_mark | 来源:发表于2018-09-20 14:08 被阅读0次

先说说UIView和CALayer

每一个UIView内部都默认关联着一个CALayer, UIView有frame、bounds和center三个属性,CALayer也有类似的属性,分别为frame、bounds、position、anchorPoint。frame和bounds比较好理解,bounds可以视为x坐标和y坐标都为0的frame,那position、anchorPoint是什么呢?先看看两者的原型,可知都是CGPoint点。

UIView 的尺寸样式都由内部的 Layer 所提供。两者都有树状层级结构,layer 内部有 SubLayers,View 内部有 SubViews.但是 Layer 比 View 多了个AnchorPoint。理解了影响Layer位置的因素也就理解了影响UIView位置的因素.

在 View显示的时候,UIView 做为 Layer 的 CALayerDelegate,View 的显示内容由内部的 CALayer 的 display

CALayer 是默认修改属性支持隐式动画的,在给 UIView 的 Layer 做动画的时候,View 作为 Layer 的代理,Layer 通过 actionForLayer:forKey:向 View请求相应的 action(动画行为)

layer 内部维护着三分 layer tree,分别是 presentLayer Tree(动画树),modeLayer Tree(模型树), Render Tree (渲染树),在做 iOS动画的时候,我们修改动画的属性,在动画的其实是 Layer 的 presentLayer的属性值,而最终展示在界面上的其实是提供 View的modelLayer

两者最明显的区别是 View可以接受并处理事件,而 Layer 不可以

拓展

anchorPoint就相当于白纸上的图钉,它主要的作用就是用来作为变换的支点,旋转就是一种变换,类似的还有平移、缩放。继续扩展,很明显,白纸的旋转形态随图钉的位置不同而不同,图钉订在白纸的正中间与左上角时分别造就了两种旋转形态,这是由图钉(anchorPoint)的位置决定的。如何衡量图钉(anchorPoint)在白纸中的位置呢?在iOS中,anchorPoint点的值是用一种相对bounds的比例值来确定的,在白纸的左上角、右下角,anchorPoint分为为(0,0), (1, 1),也就是说anchorPoint是在单元坐标空间(同时也是左手坐标系)中定义的。类似地,可以得出在白纸的中心点、左下角和右上角的anchorPoint为(0.5,0.5), (0,1), (1,0)。iOS使用左手坐标系,坐标原点在左上角,MacOS使用右手坐标系,原点在左下角。当然了MacOS我还玩不转。

像UIView有superView与subView的概念一样,CALayer也有superLayer与layer的概念,前面说到的白纸可以理解为layer,书桌的坐标系可以理解成superLayer。如果各自以左上角为原点,则有相对的两个坐标空间

position

position是layer中的anchorPoint点在superLayer中的位置坐标。因此可以说, position点是相对suerLayer的,anchorPoint点是相对layer的,两者是相对不同的坐标空间的一个重合点。
再来看看position的原始定义: The layer’s position in its superlayer’s coordinate space。
中文可以理解成为position是layer相对superLayer坐标空间的位置,很显然,这里的位置是根据anchorPoint来确定的。

anchorPoint、position、frame

anchorPoint的默认值为(0.5,0.5),也就是anchorPoint默认在layer的中心点。默认情况下,使用addSublayer函数添加layer时,如果已知layer的frame值,根据上面的结论,那么position的值便可以用下面的公式计算:

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,也就是layer坐标原点相对superLayer会有所改变。换句话说,frame.origin由position和anchorPoint共同决定,上面的公式可以变换成下面这样的:

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

这就解释了为什么修改anchorPoint会移动layer,因为position不受影响,只能是frame.origin做相应的改变,因而会移动layer。
Apple docframe的描述中有这么一句话:

Layers have an implicit frame that is a function of the position, bounds, anchorPoint, and transform properties.

当然如果加上transform就比较复杂了。

Apple doc中还有一句描述是这样的:

When you specify the frame of a layer, position is set relative to the anchor point. When you specify the position of the layer, bounds is set relative to the anchor point.

我的理解是:当你设置图层的frame属性的时候,position点的位置(也就是position坐标)根据锚点(anchorPoint)的值来确定,而当你设置图层的position属性的时候,bounds的位置(也就是frame的orgin坐标)会根据锚点(anchorPoint)来确定。
于是当设置完position再设置orgin,你的视图坐标就会偏移你设定的值

结论

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;

相关文章

  • 影响Layer位置的因素

    先说说UIView和CALayer 每一个UIView内部都默认关联着一个CALayer, UIView有fram...

  • 为什么低纬到高纬气温差异变大?

    影响地球表面气温的因素有很多,包括纬度位置、海陆位置、地形、洋流、下垫面和人类活动等因素,其中纬度位置因素是影响气...

  • 多个view360度围绕中心点旋转

    主要是在于对layer的理解。view的底层是layer。所以控制位置的其实是layer。用layer的ancho...

  • Core Animation 核心动画

    layer 实现 (直接修改layer位置,控件会跟着移动) layer 主要属性 直接修改属性,默认有动...

  • iOS:核心动画和UIView动画

    记住:核心动画都是假象(核心动画作用在layer上)原因:不能改变layer的真实属性的值展示的位置和实际的位置不...

  • iOS核心动画之组透明

    layer的透明度alpha是影响到子layer的。也就是说如果父layer的透明度为0.5,那么子layer的透...

  • 对排名的影响及其重要性分析

    影响网站SEO优化排名的因素有很多,包括已知因素甚至于位置因素,下面小马据从业经验做一个总结. 网站的年龄 这里指...

  • IOS动画简单知识

    1.layer的CATransform3D属性. 2.自定义layer,设置位置时,应该将position属性和a...

  • 【 关系不是给予你能量,就是消耗你的能量 】

    生命就是关系,所有的关系都是能量交流。有许多的因素影响着关系,包括前世、行星位置、业力循环,以及更多的因素。关系不...

  • 影响的因素

    和朋友聊天,她向我诉苦她的感情经历,因为工作原因她和男朋友没有办法公开,两个人每天都神神秘秘的不想让同事发现蛛丝...

网友评论

      本文标题:影响Layer位置的因素

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