用途:这是一份 SwiftUI 动画系统的综合参考,从基础概念到进阶技巧,帮助在实现 SwiftUI 动画、理解 VectorArithmetic、使用 @Animatable 宏、缩放转场以及 UIKit/AppKit 动画桥接时查阅。
主要能力:
- 动画原理:动画是对时间做数学插值,由 VectorArithmetic 协议驱动;内置遵循类型包括 CGFloat、Double、Float、Angle、CGPoint、CGSize、CGRect。Int 不遵循该协议,因此无法插值,需改用 Float/Double 再显示为 Int。
- 模型值与呈现值:模型值随状态立即更新,呈现值在动画期间逐帧插值。
- Animatable 协议:通过 animatableData 定义可插值数据;多属性可用 AnimatablePair 组合。自定义遵循会在主线程逐帧调用 body,性能开销大,内置效果(如 .scaleEffect()、.opacity())在非主线程运行且不调用 body。
- @Animatable 宏(iOS 26+):自动生成 Animatable 遵循,检查存储属性并构建 animatableData;用 @AnimatableIgnored 排除不参与动画的属性。
- 动画类型:时间曲线(.linear、.easeIn、.easeOut、.easeInOut、自定义 UnitCurve,默认时长 0.35 秒);弹簧(.smooth、.snappy、.bouncy,或 .spring(duration:bounce:));高阶修饰(.delay、.repeatCount、.repeatForever、.speed)。iOS 17 起 withAnimation 默认使用 .smooth 弹簧。
- Transaction 系统:withAnimation 触发动画,withAnimation(nil) 关闭动画;.animation(_:value:) 针对特定值;iOS 17+ 作用域动画可只对闭包内属性生效;可自定义 TransactionKey。
- 进阶:CustomAnimation 协议(animate 返回值为增量向量,完成时返回 nil)、动画合并行为(时间曲线默认不合并,弹簧合并并保留速度)、PhaseAnimator 与 KeyframeAnimator 多步动画。
系统要求:iOS 13+ 支持 Animatable 与时间/弹簧动画;iOS 17+ 支持默认弹簧、作用域动画、PhaseAnimator、KeyframeAnimator;iOS 18+ 支持缩放转场与 UIKit/AppKit 动画桥接;iOS 26+ 支持 @Animatable 宏。
限制:资料未提供安装命令、收费与价格信息;自定义 Animatable 遵循有性能代价,应仅在内置修饰无法实现时使用。