
Dance 链式调用实战如何写出优雅易读的 iOS 动画代码【免费下载链接】DanceA radical elegant animation library for iOS.项目地址: https://gitcode.com/gh_mirrors/dance1/DanceDance 是一款专为 iOS 打造的动画库它基于 iOS 10 引入的UIViewPropertyAnimator能力把创建动画、添加完成回调、启动动画压缩成一行行可以无限串联的代码帮你轻松写出优雅易读的 iOS 动画代码。本篇文章面向 Swift 新手与普通开发者用最少的代码量带你吃透 Dance 链式调用从此告别回调嵌套地狱。太长不看版view.dance.animate { ... }.addCompletion { ... }.start()一条链式调用就能完成传统写法 20 行才能做到的事。为什么你的 iOS 动画代码越写越乱在传统写法里一个移动 变色 完成后缩放的动画往往长这样UIView.animate(withDuration: 2.0, animations: { circle.center self.view.center circle.backgroundColor .blue }, completion: { _ in UIView.animate(withDuration: 1.0, animations: { circle.transform CGAffineTransform(scaleX: 1.5, y: 1.5) }, completion: { _ in // 下一层嵌套…… }) })嵌套的completion一层套一层动画一多代码就变成了回调金字塔。而 Dance 的链式调用把这些问题一次性解决✅ 平铺式语法动画流程从左到右阅读逻辑一目了然✅ 动画与视图绑定任何地方都能随时控制✅ 底层基于UIViewPropertyAnimator天然支持暂停、反转、进度拖拽认识 Dance为优雅而生的 iOS 动画库Dance 的全部源码集中在一个文件Dance.swift中核心思路非常简单通过UIView扩展暴露一个dance属性每个动画方法都返回Dance自身从而实现无限链式调用。对比系统动画 APIDance 的能力差异一目了然能力系统 UIView.animateDance 链式调用创建动画✅✅animate()添加完成回调只能嵌套✅.addCompletion{}平铺启动动画自动启动✅.start()手动控制暂停 / 反转❌ 不支持✅.pause()/.reverse()拖拽进度❌ 不支持✅.setProgress(to:)提前结束❌ 不支持✅.finish(at:)一分钟看懂 Dance 链式调用的核心语法所有 Dance 方法都以view.dance开头之后便可以任意串联circle.dance .animate(duration: 2.0, curve: .easeInOut) { $0.center self.view.center } .addCompletion { _ in print(动画完成) } .start()注意一个小细节链式调用开始后后续方法不需要再写.dance代码的阅读顺序就是动画的执行顺序这正是优雅易读的 iOS 动画代码的秘诀。用 animate() 快速创建你的第一个 iOS 动画animate()提供了四种时间曲线覆盖绝大多数场景源码见Dance.swift中的animate系列方法UIKit 内置曲线.easeInOut/.easeIn/.easeOut/.linear弹簧参数dampingRatio值越小越弹自定义贝塞尔曲线controlPoint1controlPoint2高级时序对象timingParameters如UISpringTimingParameters新手最常用的是第一种配合 Swift 闭包简写$0动画代码可以短到惊人// 放大 变色 位移一次搞定 circle.dance.animate(duration: 1.5, dampingRatio: 0.6) { $0.transform CGAffineTransform(scaleX: 1.5, y: 1.5) $0.backgroundColor .blue $0.center self.view.center }三步写出优雅易读的 iOS 动画代码第一步创建动画只编排剧本不会立即播放circle.dance.animate(duration: 2.0, curve: .easeOut) { $0.center endPosition }第二步挂上完成回调.addCompletion { position in if position .end { print(到达终点) } }第三步启动动画支持延迟.start(after: 5.0) // 5 秒后开始把三步连起来就是一条完整的链式调用circle.dance.animate(duration: 2.0, curve: .easeOut) { $0.center endPosition }.addCompletion { position in if position .end { print(到达终点) } }.start(after: 5.0)这样写别人读你的代码时就像在读一句自然语言让 circle 两秒内移动到终点完成后打印提示5 秒后开播。暂停、反转与进度拖拽像控制视频一样控制动画Dance 把动画当作一部可控制的电影完整示例见DanceExample/ViewController.swiftcircle.dance.pause() // ⏸ 暂停 circle.dance.reverse() // 倒放 circle.dance.setProgress(to: 0.5) // 拖到 50% 的位置 circle.dance.finish(at: .current) // 立即结束并渲染当前位置更妙的是这些控制命令同样可以链式拼接circle.dance.pause().setProgress(to: 0.25) circle.dance.start().reverse()由于动画与视图绑定内部通过DanceFactory管理每个视图的UIViewPropertyAnimator你可以在任何能拿到视图引用的地方控制动画——比如把.pause()写进按钮的点击事件里完全不需要额外保存任何状态。约束动画也能链式调用Auto Layout 约束动画是很多开发者的痛点。Dance 的做法很聪明在动画闭包里只对目标视图调用$0.layoutIfNeeded()只布局该视图及其子视图既流畅又省电heightConstraint.constant 200 card.dance.animate(duration: 0.5, curve: .easeInOut) { $0.layoutIfNeeded() }.start()5 分钟快速开始安装 Dance 动画库方式一CocoaPods 安装推荐在 Podfile 中添加一行然后执行pod installpod Dance方式二直接拖入源码Dance 只有一个源文件Dance.swift把它拖进工程即可零依赖。方式三clone 示例工程git clone https://gitcode.com/gh_mirrors/dance1/Dance工程自带DanceExample演示项目其中ViewController.swift完整展示了动画的创建、暂停、反转、进度拖拽和重置配合 Storyboard 跑一遍理解速度翻倍。使用前记得在文件头部import Dance并确保工程支持iOS 10。调试技巧容错设计让新手零压力Dance 的设计哲学是宽容——即使你写错了也不会崩溃对还没有创建动画的视图调用.start()只会打印一句友好的错误日志不会闪退重复为同一视图创建动画时旧的动画会被自动finish在当前位置避免冲突。你还可以通过circle.dance.tag定位每个动画用circle.dance.state判断动画处于.active还是.inactive让调试变得一目了然。写在最后优雅易读的 iOS 动画代码核心不在于少写几行而在于代码的阅读顺序等于动画的执行顺序。Dance 用一套极简的链式调用把UIViewPropertyAnimator的全部能力包装成了新手也能上手、老手也会喜欢的体验。如果你正被动画回调嵌套折磨不妨现在就 clone 示例工程跑一跑亲身感受一次链式调用带来的清爽。【免费下载链接】DanceA radical elegant animation library for iOS.项目地址: https://gitcode.com/gh_mirrors/dance1/Dance创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考