别再手写帧动画了:5分钟上手 Lottie-ios 的 iOS 动画渲染实战与避坑清单
【免费下载链接】lottie-iosAn iOS library to natively render After Effects vector animations项目地址: https://gitcode.com/GitHub_Trending/lo/lottie-ios
Lottie-ios 是 Airbnb 开源的 iOS 动画库,把 After Effects 导出的 JSON 动画直接在原生层渲染出来,不用逐帧手撸。读完带走:
- 最短路径:一条命令装好,几行代码跑出第一个动画
- 4 个高频场景(循环、交互、远程加载、.lottie 包)的完整代码
- 选它还是绕开它的判断标准,以及调优要点
一分钟跑通
环境要求:Xcode 14+,iOS 13.0+ 部署目标(SPM 最低支持 iOS 13)。
只推荐 Swift Package Manager 安装,在 Xcode 里 File → Add Package Dependencies,输入仓库地址,或直接在Package.swift加:
.package(url: "https://gitcode.com/GitHub_Trending/lo/lottie-ios", from: "4.6.0")最小可运行代码,放进任意 ViewController:
import Lottie // JSON 已拖进项目,写文件名(不带 .json) let animationView = LottieAnimationView(name: "LottieLogo1") animationView.contentMode = .scaleAspectFit // 等比缩放 animationView.loopMode = .loop // 循环播,不写默认只播一次 view.addSubview(animationView) animationView.play()跑起来就是仓库测试用例里的效果:
真实场景拆解
场景:Loading 状态循环播放
列表加载、网络请求时的等待动画,要无限循环、不占 CPU。
let loadingView = LottieAnimationView(name: "Boat_Loader") loadingView.loopMode = .loop // 无限循环 loadingView.contentMode = .scaleAspectFit loadingView.play() // 请求结束记得停 loadingView.stop()⚠️loopMode默认是.playOnce,忘设置就会播一遍就停,Loading 转一帧就定住,这是新手最高频的坑。
场景:按钮按下触发交互动画
汉堡菜单变箭头、点赞小动画这类「按下播一段、松手播一段」的交互,别自己算进度条,直接用库内置的AnimatedButton:
let button = AnimatedButton(animation: LottieAnimation.named("HamburgerArrow")) button.setPlayRange( fromProgress: 0, toProgress: 0.4, event: .touchDown ) button.setPlayRange(fromProgress: 0.4, toProgress: 1, event: .touchUpInside)⚠️ 播放区间用 progress(0~1)而不是帧号时,设计师改动画时长后你的比例会漂移;给动画打 Marker 再按名字播放(play(marker:)),改时长也不动代码。
场景:从网络远程加载动画
运营配置下发动画、A/B 测试换素材,走 URL 异步加载:
let url = URL(string: "https://cdn.example.com/animation.json")! let remoteView = LottieAnimationView(url: url) { error in if let error { print("下载失败: \(error)") } } view.addSubview(remoteView) remoteView.play()⚠️ 这个初始化器下载完成后才会赋值animation,别在闭包里再手动设一次,也别在主线程外创建视图;URL 加载自带 LRU 缓存,重复请求直接命中。
场景:.lottie 多动画包文件
新格式.lottie是一个压缩包,能塞多个动画和素材,加载是异步解包:
let dotView = LottieAnimationView(dotLottieName: "Switch") { view, error in guard error == nil else { return } view.play() // 解包完才能播 }⚠️.lottie解压发生在后台,动画就绪前视图是空的;需要占位时改用animationLoaded回调统一处理播放时机。
选它还是绕开它?
✅ 适合的场景
- 设计师用 After Effects 出了矢量动画,要原样还原到 iOS
- 列表、Loading 里反复播放的中小体量循环动画
- 需要运行时换颜色、文本、位置等属性(Value Provider)
- 一个动画文件要在 iOS / macOS / tvOS / visionOS 通用
❌ 不适合或另有更优解
- 全屏视频质感(粒子爆炸、真实光照):直接用视频或 Metal,JSON 表达力有限
- 简单转场、按钮态切换:UIKit 原生
UIViewPropertyAnimator更轻,没必要引入整个引擎 - 动画内含 After Effects 表达式:Core Animation 引擎不支持,会自动回落主线程引擎,性能优势归零(当前版本已知局限,主线程引擎才有完整功能集)
细粒度控制 & 调优要点
当你需要更细控制时,这几个 API 覆盖 90% 的需求:
animationView.currentProgress = 0.5 // 手指拖动同步进度 animationView.play(fromProgress: 0.2, toProgress: 0.8) // 只播一段 let key = AnimationKeypath(keypath: "**.Fill 1.Color") // 通配 keypath animationView.setValueProvider(ColorValueProvider(.red), keypath: key) // 运行时换色 animationView.animationSpeed = 2.0 // 播快一倍性能注意项:
- 默认
automatic引擎:能用 Core Animation 就用(零 CPU 开销),不支持的特性自动回落主线程引擎,无需手动切换 - 主线程引擎的动画离屏时默认暂停(
backgroundBehavior),别为「后台继续播」强行设.continuePlaying,那是给 Core Animation 引擎用的 - 列表里大量复用 Lottie 视图时,给静态展示帧开
shouldRasterizeWhenIdle = true,空闲时栅格化更省
资源导航
- 示例项目:可浏览 100+ 示例动画的完整 App
- 核心源码:动画视图、引擎、Value Provider 全在这里
- 动画样例库:现成 JSON / .lottie 文件,拖进项目就能跑
- SwiftUI 封装
- 渲染引擎配置
把第一个动画跑起来,剩下的交给上面的场景代码。
【免费下载链接】lottie-iosAn iOS library to natively render After Effects vector animations项目地址: https://gitcode.com/GitHub_Trending/lo/lottie-ios
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考