iOS 动画 (一)

222 阅读2分钟

这是我参与 8 月更文挑战的第 3 天,活动详情查看: 8月更文挑战

简单的UIView动画属性

  • 基于block的UIView动画允许你提供一个视图的最终状态以及动画时间,由系统自动计算变化规律并重绘
[UIView animateWithDuration: 1.5f animations: ^{
    self.myView.alpha = 1;
}];

Core Animation

  • UIView 视图最终由Calayer展示。

  • contents 描述的是一个图像信息,在代码层面最接近于屏幕上可以显示的数据对象

image.png

  • contents的内容可以从内容缓冲区中生成

    • -(void) drawlnContext:(CGContextRef) ctx
  • 拿到内容缓冲区,通过CoreGraphics进行相应的绘制操作

  • Core Graphics会通过GPU驱动暴露出来的API进行调用

image.png

  • 内容呈现根据实现机制可分为两类
    • 内容刷新
      • 被调用display, 由系统调用,系统把握更好的时机。使用者只需要调用setNeedsDisplay标记,若急需刷新调用displayIFNeed
    • 提供内容
      • display
      • delegate 的 displayLayer
      • drawnlnContext
      • delegate 的 drawLay: inContext
  • 图层树

image.png

image.png

  • CoreTransaction
    • 动画事务管理
    • CoreAnimation基于一个假设,即屏幕上的任何东西都可以(或者可能)做动画,所以当你改变CALayer的可做动画的属性,就会默认以平滑的动画改变,默认的duration是0.25秒,这就是所谓的隐式动画(ps:根层的layer没有隐式动画)。
    • Core Animation使用CATransaction来管理动画事务,对干隐式动画,系统自动创建了一个隐式 CATransaction来管理。
    • 我们也可以用到CATransaction来设置一些动画参数。有时候,调用一个接口做一些动画,但是接口并没有提供一个参数completionBlock,也可以利用CATransaction来添加completionBlock而不用改到别人的接口。如果有时需要关闭隐式动画,我们也可以通过调用[CATransactionsetDisableActions:YES];关闭
    • CATransaction 是事务,用于批量提交多个layer-tree的操作,并且是原子性的。所有对layer-tree的修改都必须包含在事务内。事务可以嵌套。