【iOS开发基础】Core Animation

iOS动画的类型

iOS开发中常见的动画类型包括UIView动画、Core Animation和UIKit Dynamics。UIView动画适合简单视图属性变化,Core Animation提供更复杂的图层动画,UIKit Dynamics则用于物理模拟效果。

UIView基础动画

UIView类提供简单的方法实现属性动画,如透明度、位置和大小变化。通过animate(withDuration:animations:)方法可以快速实现平滑过渡效果。

UIView.animate(withDuration: 0.5) {
    view.alpha = 0
    view.center = CGPoint(x: 200, y: 200)
}

关键帧动画

对于需要多阶段控制的动画,可以使用animateKeyframes方法创建关键帧序列。每个关键帧定义动画过程中的特定状态。

UIView.animateKeyframes(
    withDuration: 2.0,
    delay: 0,
    options: [.calculationModeLinear],
    animations: {
        UIView.addKeyframe(withRelativeStartTime: 0.0, relativeDuration: 0.5) {
            view.center.x += 100
        }
        UIView.addKeyframe(withRelativeStartTime: 0.5, relativeDuration: 0.5) {
            view.center.y += 100
        }
    }
)

Core Animation高级特性

CALayer及其子类提供更精细的动画控制。CABasicAnimation用于基本属性动画,CAKeyframeAnimation支持路径动画,CATransition处理转场效果。

let animation = CABasicAnimation(keyPath: "position.x")
animation.fromValue = view.layer.position.x
animation.toValue = view.layer.position.x + 100
animation.duration = 1.0
view.layer.add(animation, forKey: "moveRight")

弹簧动画

UIView的animate(withDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:)方法可以创建具有弹簧物理特性的动画效果,参数damping控制弹性强度。

UIView.animate(
    withDuration: 1.0,
    delay: 0,
    usingSpringWithDamping: 0.5,
    initialSpringVelocity: 0,
    options: [],
    animations: {
        view.bounds.size.width += 50
    }
)

Core Animation 原理

Core Animation 是苹果提供的图形渲染和动画框架,基于图层(CALayer)而非视图(UIView)实现。其核心原理包括:

  • 图层树(Layer Tree):CALayer 是轻量级对象,负责内容绘制和动画管理。视图的层级对应隐式的图层树。
  • 事务(Transaction):动画通过 CATransaction 机制批量提交,支持隐式(默认)和显式(自定义)两种方式。
  • 渲染流水线:动画帧通过 Core Animation 提交给 Render Server,最终由 GPU 渲染,避免 CPU 直接参与每帧绘制。

使用方法

基本动画(CABasicAnimation)
let animation = CABasicAnimation(keyPath: "position.x")
animation.fromValue = 0
animation.toValue = 100
animation.duration = 1.0
layer.add(animation, forKey: "moveX")
关键帧动画(CAKeyframeAnimation)
let animation = CAKeyframeAnimation(keyPath: "position")
animation.values = [CGPoint(x: 0, y: 0), CGPoint(x: 100, y: 100)]
animation.keyTimes = [0, 1]
animation.duration = 2.0
layer.add(animation, forKey: "movePath")
动画组(CAAnimationGroup)
let group = CAAnimationGroup()
group.animations = [scaleAnimation, rotateAnimation]
group.duration = 2.0
layer.add(group, forKey: "groupAnimation")

特性

  • 隐式动画:修改 CALayer 的可动画属性(如 opacity)会自动触发默认动画。
  • CAMediaTiming 协议:控制动画时间曲线(timingFunction)、重复次数(repeatCount)等。
  • 3D 变换:支持通过 CATransform3D 实现透视效果和三维旋转。

优化思路

  • 离屏渲染避免:减少 cornerRadius + masksToBounds 组合使用,用 CAShapeLayer 替代。
  • 图层混合优化:避免不必要的透明图层(设置 opaque = true)。
  • 光栅化缓存:对静态内容启用 shouldRasterize,但需注意缓存失效问题。
  • 异步绘制:通过 CALayerDelegatedisplay(_:) 方法在后台线程绘制内容。
  • 动画性能优化:减少离屏渲染和图层混合能提高动画性能。使用shouldRasterize和opaque属性优化视图层级,避免在动画过程中进行昂贵计算。Core Animation的CADisplayLink适合需要与屏幕刷新同步的动画。

注意事项

  • 主线程限制:CALayer 属性修改必须在主线程,但动画渲染在 Render Server 进程完成。
  • 内存管理:大量图层会导致内存压力,需监控 CALayer.contents 的内存占用。
  • 动画生命周期:默认动画结束后会恢复初始状态,需设置 isRemovedOnCompletion = false 保持最终状态。
  • 性能工具:使用 Core Animation Instrument 检查离屏渲染和帧率问题。

 官方开发文档:Core Animation | Apple Developer Documentation

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值