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
,但需注意缓存失效问题。 - 异步绘制:通过
CALayerDelegate
的display(_:)
方法在后台线程绘制内容。 -
动画性能优化:减少离屏渲染和图层混合能提高动画性能。使用shouldRasterize和opaque属性优化视图层级,避免在动画过程中进行昂贵计算。Core Animation的CADisplayLink适合需要与屏幕刷新同步的动画。
注意事项
- 主线程限制:CALayer 属性修改必须在主线程,但动画渲染在 Render Server 进程完成。
- 内存管理:大量图层会导致内存压力,需监控
CALayer.contents
的内存占用。 - 动画生命周期:默认动画结束后会恢复初始状态,需设置
isRemovedOnCompletion = false
保持最终状态。 - 性能工具:使用 Core Animation Instrument 检查离屏渲染和帧率问题。