Dance 动画 Auto Layout 约束实战用 layoutIfNeeded 优雅实现布局动画【免费下载链接】DanceA radical elegant animation library for iOS.项目地址: https://gitcode.com/gh_mirrors/dance1/Dance很多 iOS 新手在写Auto Layout 约束动画时会遇到一个经典困惑明明修改了约束的constant界面却啪地一下直接跳到终点完全看不到动画过程。想实现丝滑的约束动画关键在于配合layoutIfNeeded强制刷新布局。而基于UIViewPropertyAnimator构建的轻量级 iOS 动画库Dance把这件事简化成了一句代码view.dance.animate { $0.layoutIfNeeded() }。这篇文章带你完成一次 Dance 动画 Auto Layout 约束实战从原理到代码一次讲透。为什么你的 Auto Layout 约束动画总是不生效约束Constraint并不是直接作用在视图frame上的。修改constant只是更新了约束对象本身系统不会立刻重新布局更不会自动产生动画。如果缺少layoutIfNeeded界面自然瞬移到新位置。常见的错误写法是只改约束、忘了刷新view.heightConstraint.constant 200 UIView.animate(withDuration: 0.5) { // 这里漏掉了 layoutIfNeeded() }正确姿势修改约束之后在动画闭包内部调用layoutIfNeeded()系统才会把约束数值的变化补间成一段流畅的动画。Dance 动画库是什么3 分钟快速上手 Dance 是构建于 iOS 10 的UIViewPropertyAnimator之上的动画框架整个库只有一个源文件 Dance.swift通过UIView扩展暴露了view.dance接口扩展定义见这里。创建一段动画非常简单import Dance circle.dance.animate(duration: 2.0, curve: .easeInOut) { $0.transform CGAffineTransform(scaleX: 1.5, y: 1.5) $0.backgroundColor .blue }.addCompletion { _ in print(动画播放完毕) }.start()你不需要保存任何动画对象之后随时可以通过.pause()、.reverse()、.finish(at:)、.setProgress(to:)控制这段动画非常宽容。约束动画核心三步骤 ✨以点击按钮让卡片展开为例完整流程只需要三步第一步修改约束常量cardHeightConstraint.constant 300第二步在 Dance 动画闭包内调用 layoutIfNeededcard.dance.animate(duration: 0.6, dampingRatio: 0.8) { $0.layoutIfNeeded() }.start()第三步随时干预动画card.dance.pause() // 暂停 card.dance.reverse() // 反向回放 card.dance.finish(at: .current) // 结束在当前进度三步搞定比原生UIView.animate少了大量样板代码可读性也更强。为什么推荐 $0.layoutIfNeeded() 而不是 self.view.layoutIfNeeded()⚡这是 Dance 在约束动画上一个非常贴心的设计。很多教程会教你调用self.view.layoutIfNeeded()但这会让整个视图层级的所有子视图全部重新布局一次——子视图越多开销越大越容易掉帧。Dance 的做法是只对正在动画的那个视图及其子视图触发布局官方文档说明示例代码从源头保证了低开销与高帧率这也是它名字里elegant优雅的体现。进阶玩法可拖拽、可反转的约束动画 因为 Dance 底层是UIViewPropertyAnimator天然支持进度拖拽。你可以像看电影一样用滑块控制约束动画slider.addTarget(self, action: #selector(sliderChanged), for: .valueChanged) objc func sliderChanged(_ sender: UISlider) { card.dance.setProgress(to: sender.value) // 取值 0~1 }官方 Demo 的 ViewController.swift 里就有完整实现一个滑块实时控制动画进度非常适合做手风琴式展开菜单、可交互侧边栏等效果。常见问题与避坑清单 ✅约束修改与layoutIfNeeded()必须写在同一个动画闭包里分开写不会生效动画开始前先调用一次layoutIfNeeded()强制刷新当前布局避免视图从旧位置起跳别忘了调用.start()Dance 的 animate 方法 只负责创建动画start() 才负责播放安装方式二选一CocoaPods 集成pod Dance或直接把Dance.swift拖进工程小结Dance 动画库把UIViewPropertyAnimator的强大能力封装成了极其简洁的 API配合layoutIfNeededAuto Layout 约束动画从麻烦事变成了三行代码。建议你 clone 仓库跑一遍官方 Demo 亲手体验https://gitcode.com/gh_mirrors/dance1/Dance配合示例项目中的注释文档ViewController.swift食用更佳。【免费下载链接】DanceA radical elegant animation library for iOS.项目地址: https://gitcode.com/gh_mirrors/dance1/Dance创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考