iOS核心动画学习

来源:互联网 发布:人工智能汽车 编辑:程序博客网 时间:2024/05/16 13:42

CALayer的能力

CALayer 所具有而UIView没有的功能

  • 阴影 圆角 带颜色的边框
  • 3D变换
  • 非矩形范围
  • 透明遮罩
  • 多级非线性动画

CALayer寄宿图的各种属性

  • contents 属性
    这个用来呈现图层的内容,赋值的类型是CGImageRef,这是一个纸箱CGImage结构的指针
layer.contents= (__bridge id)image.CGImage;
  • contentsGravity
    这个是用来设置图层显示的方式,是为了决定内容在图层的边界中怎么对其。类型常量有下面几种
    kCAGravityCenter
    kCAGravityTop
    kCAGravityBottom
    kCAGravityLeft
    kCAGravityRight
    kCAGravityTopLeft
    kCAGravityTopRight
    kCAGravityBottomLeft
    kCAGravityBottomRight
    kCAGravityResize
    kCAGravityResizeAspect
    kCAGravityResizeAspectFill
    经常使用的属性是 kCAGravityResizeAspect

  • masksToBounds
    用来决定是否显示超出边界的内容,默认值为NO

  • contentsRect
    这个属性允许我们在图层边框里显示寄宿图的一个子域。
    contentsRect不是按点来计算的,它使用了单位坐标,0到1之间,是一个相对值。

  • mask
    mask是CALayer的一个属性,这个属性返回的是一个CALayer的指针。这个属性的用处是可以使得视图展现一个不规则的边界,这个边界不用drawRect重绘来实现。这个属性本身就是个CALayer类型,有和其他图层一样的绘制和布局属性。它类似于一个子图层,相对于父图层(即拥有该属性的图层)布局,但是它却不是一个普通的子图层。不同于那些绘制在父图层中的子图层,mask图层定义了父图层的部分可见区域。
    mask图层的Color属性是无关紧要的,真正重要的是图层的轮廓。mask属性就像是一个饼干切割机,mask图层实心的部分会被保留下来,其他的则会被抛弃。mask图层的颜色是不会展现出来的,最重要的是mask layer的轮廓。
    这里写图片描述
    就是上图,最后合成的图片的轮廓是mask的轮廓,但是内容还是图片原来的内容

隐式动画

单独添加一个图层(CALayer)默认会产生动画
UIView自带的图层(view.layer)之所以没有动画,是因为UIView把隐式动画给禁止了。每个UIView对它关联的图层都扮演了一个委托,并且提供了-actionForLayer:forKey的实现方法。当不在一个动画块的实现中,UIView对所有图层行为返回nil,但是在动画block范围之内,它就返回了一个非空值。

  • UIView关联的图层禁用了隐式动画,对这种图层做动画的唯一办法就是使用UIView的动画函数(而不是依赖CATransaction),或者继承UIView,并覆盖-actionForLayer:forKey:方法,或者直接创建一个显式动画
  • 对于单独存在的图层,我们可以通过实现图层的-actionForLayer:forKey:委托方法,或者提供一个actions字典来控制隐式动画(或者使用显示动画)

防射变换

CGAffineTransform 中的“防射”的意思是无论变换矩阵用什么值,图形中平行的两条线在变换之仍然保持平行

呈现与外观

呈现图层 (presentationLayer)这个呈现图层实际上是模型图层的复制,但是它的属性值代表了在任何指定时刻当前外观效果。换句话说,你可以通过呈现图层的值来获取当前屏幕上真正显示出来的,我的理解就是在动画执行的每个时间点上图层。

当你改变一个图层的属性,属性值的确是立刻更新的(如果你读取它的数据,你会发现它的值在你设置它的那一刻就已经生效了),但是屏幕上并没有马上发生改变。这是因为你设置的属性并没有直接调整图层的外观,相反,他只是定义了图层动画结束之后将要变化的外观。