1、UIView和CALayer
(1)UIView中有个属性layer,是CALayer类型。
(2)UIView是CALayer的delegate。
(3)UIView继承自UIResponder,可以响应事件。
(4)CALayer继承自NSObject,包含要显示的内容contents,以及backgroundcolor,frame,bounds等控件的尺寸和样式。
(5)CALayer的contents中是backing store,实际上是bitmap类型的位图。
(6)两者都有层级结构。
(7)CALayer中透明度使用opacity表示而不是alpha;中心点使用position表示而不是center。
(8)CALayer的AnchorPoint、Position
-
anchorPoint属性是图层的锚点,范围在(01,01)表示在x、y轴的比例,这个点永远可以同position(中心点)重合,当图层中心点固定后,调整anchorPoint即可达到调整图层显示位置的作用(因为它永远和position重合)
-
CALayer里的AnchorPoint(锚点):是相对于自身layer,iOS坐标系中(0,0), (1,1)分别表示左上角、右下角。AnchorPoint相当于支点,可以用作旋转变化、平移、缩放。
-
CALayer里的position: 是AnchorPoint点在superLayer中的位置坐标。position点是相对superLayer的。
-
关于Position和AnchorPoint图示(如果修改anchorPoint则layer的frame会发生改变,position不会发生改变.修改position与anchorPoint中任何一个属性都不影响另一个属性)
-
最大差异:
<1> UIView为CALayer显示提供基础,UIView负责处理触摸等事件,参与事件响应链。
<2> CALayer只是负责提供内容contents的绘制和显示。
-
补充:关于bounds的x和y的问题
<1>示例代码一:只改变父视图的bounds的x、y
<2>效果一:子视图参考的坐标系原点向左和向上偏移了20
<3>示例代码二:改变视图bounds的w和h,使其大于自己frame的w和h
<4>效果二:视图frame的x、y、w、h都变了50(撑大了)
bounds的w和h,不仅会影响frame的w和h(两者的width和height保持一致),还会影响frame的x,y。这种影响是随着bounds的w和h增加或减少,平均扩充或缩减四周的区域。
<5>总结
它可以修改自己坐标系的原点位置,进而影响“子view”的显示位置(改变了子视图的参考原点)。 bounds可以通过改变宽高,改变自身的frame,进而影响到自己在父视图的显示位置和大小。
-
补充:UIView关联的layer和单独的layer在动画上的不同
<1> 隐式动画:我们并没有指定任何动画类型,仅仅改变了一个属性,然后CoreAnimation来决定如何并何时去做动画(区别于显示动画需要配置)。当我们改变一个属性的时候,CoreAnimation是如何判断动画类型和持续时间(默认0.25s)的呢?实际上动画执行的时间取决于当前事务的设置,动画类型取决于图层行为。
<2>禁用关联图层的隐式动画: 隐式动画会被layer的关联图层禁用(UIView下的layer会禁用):当属性在动画块之外发生变化,UIView调用actionForKey直接返回nil来禁用了隐式动画。但在动画块之内,根据动画具体类型返回相应属性。 UIView关联的图层禁用了隐式动画,对这种图层做动画的唯一方法就是使用UIView的动画函数,而不是依赖CATransaction;或者继承UIView,并覆盖actionForlayer:forkey方法;或者直接创建一个显式动画。
<3>控制非关联图层的隐式动画: 对于单独存在的的图层,我们可以通过实现图层-actionForLayer:forkey:委托方法,或者提供一个actions字典来控制隐式动画的行为(设置动画的行为)。控制动画时间还是依赖CATransaction(事务)。
<4>关闭layer的隐式动画: 手动关闭[CATransaction setDisableActions:YES]
<5> 参考 :www.jianshu.com/p/d35ba2d4c…