iOS动画技术——CoreAnimation框架之图层

时间:2023-02-06 23:38:43

概要:图层(CALayer)是动画发生的场所,包括UIView动画都发生在图层中。
视图和图层的异同:
      图层的很多方面和视图十分相同,它有位置、大小、变换和内容等属性。我们可以自定义图层,重写绘制方法,从而实现自己绘制图层的目的,图层也有层次关系,有自己的父图层和子图层。区别是视图是重量级对象,它负责绘制和事件响应,图层负责绘制,事实上视图依赖于图层实现绘制处理。

一.图层的坐标系


二.图层的几何

  • @property CGRect bounds;图层的边界
  • @property CGPoint position;图层的位置
  • @property CGFloat zPosition;在视图中可以用很多图层,通过该属性可以区别它们在立体空间中的深度,即Z轴上的顺序

  • 三.图层的几何变换


    四.图层的操作:

    图层有一个图层树,既然是树,就允许添加、插入、删除和替换相应的图层。

  • 图层的添加
  • - (void)addSublayer:(CALayer *)layer;

  • 图层的插入
  • - (void)insertSublayer:(CALayer *)layer atIndex:(unsigned)idx;
    - (void)insertSublayer:(CALayer *)layer below:(CALayer *)sibling;
    - (void)insertSublayer:(CALayer *)layer above:(CALayer *)sibling;

  • 图层的替换
  • - (void)replaceSublayer:(CALayer *)layer with:(CALayer *)layer2;

  • 图层的替换
  • - (void)removeFromSuperlayer;

    图层的内容提供

  • @property(strong) id contents;图层的内容,能够接收CGImmageRef类型数据,或者是其他图层的内容
  • @property(copy) NSString *contentsGravity;图层内容的摆放方式,有枚举常量

  • 五、为什么CALayer中使用CGColorRef和CGImageRef这2种数据类型,而不用UIColor和UIImage?

    • 首先要知道:CALayer是定义在QuartzCore框架中的;CGImageRef、CGColorRef两种数据类型是定义在CoreGraphics框架中的;UIColor、UIImage是定义在UIKit框架中的
    • 其次,QuartzCore框架和CoreGraphics框架是可以跨平台使用的,在iOS和Mac OS X上都能使用,但是UIKit只能在iOS中使用
    • 因此,为了保证可移植性,QuartzCore不能使用UIImage、UIColor,只能使用CGImageRef、CGColorRef.
    • 不过很多情况下,可以通过UIKit对象的特定方法,得到CoreGraphics对象,比如UIImage的CGImage方法可以返回一个CGImageRef

    六、UIView和CALayer的选择

    细心的朋友不难发现,其实前面的2个效果不仅可以通过添加层来实现,还可以通过添加UIView来实现。比如,第1个红色的层可以用一个UIView来实现,第2个显示图片的层可以用一个UIImageView来实现。 既然CALayer和UIView都能实现相同的显示效果,那究竟该选择谁好呢?

    • 其实,对比CALayer,UIView多了一个事件处理的功能。也就是说,CALayer不能处理用户的触摸事件,而UIView可以
    • 所以,如果显示出来的东西需要跟用户进行交互的话,用UIView;如果不需要跟用户进行交互,用UIView或者CALayer都可以
    • 当然,CALayer的性能会高一些,因为它少了事件处理的功能,更加轻量级

    辨析:
    一、position和anchorPoint

    • position和anchorPoint属性都是CGPoint类型的
    • position可以用来设置CALayer在父层中的位置,它是以父层的左上角为坐标原点(0, 0)
    • anchorPoint称为”定位点”,它决定着CALayer身上的哪个点会在position属性所指的位置。它的x、y取值范围都是0~1,默认值为(0.5, 0.5)

    二.可动画属性
    bounds:用于设置CALayer的高度和宽度,修改这个属性可以产生缩放动画。
    backgroundColor:用于设置CALayer的背景色,修改这个属性会产生背景色的渐变动画。
    position:用于设置CALayer的位置,修改这个属性会产生平移动画。