当前位置: 首页 > news >正文

如何给ScrollingStackViewController定制弹性动画:覆盖animate与scrollAnimate闭包的完整指南

如何给ScrollingStackViewController定制弹性动画:覆盖animate与scrollAnimate闭包的完整指南

【免费下载链接】ScrollingStackViewControllerA view controller that uses root views of child view controllers as views in a UIStackView.项目地址: https://gitcode.com/gh_mirrors/sc/ScrollingStackViewController

ScrollingStackViewController 是 iOS 上一个轻量的滚动容器控件:它把子视图控制器的根视图放进UIStackView,再用UIScrollView实现滚动,非常适合“少量、动态、富内容分区”的页面。刚集成时,默认的过渡动画偏“硬”,很多同学想把它调成更有弹性的效果——核心就在于本文的主角:覆盖animatescrollAnimate两个公开闭包,几行代码就能换掉整套动画。

一图看懂:两个动画闭包各管什么

ScrollingStackViewController 把“分区显示/隐藏动画”和“滚动动画”拆成了两个独立可覆盖的闭包,这是定制弹性动画的全部入口:

闭包默认参数生效于哪些方法
animate0.5 秒弹簧,damping = 1(无回弹)show/hide/set(_:hidden:animated:),以及带动画的remove
scrollAnimate0.75 秒弹簧,damping = 0.7,初始速度 = 0.25scrollTo(viewController:)

💡 两个默认实现defaultAnimatedefaultScrollAnimate都定义在ScrollingStackViewController/Classes/ScrollingStackViewController.swift(第 49–77 行),而animatescrollAnimate只是两个公开属性,初始值指向默认实现——所以随时可以直接赋值替换。

两个闭包的签名一致:传入“要执行的动画块”和一个completion回调(Bool表示动画是否完成),你只需要用自己喜欢的UIView.animate(...)方式把它们跑起来。

覆盖 animate:给分区显示/隐藏加上弹性回弹

想让show(vc)/hide(vc)出现“boing”的回弹感,把dampingRatio调到 1 以下即可:

animate = { animations, completion in UIView.animate(withDuration: 0.8, dampingRatio: 0.6, initialSpringVelocity: 0.5, options: [], animations: animations, completion: completion) }

参数提示:dampingRatio = 1表示完全不回弹;数值越小,弹跳越明显。initialSpringVelocity越大,起手越有“甩出去”的感觉。

覆盖 scrollAnimate:换掉“滚动到指定分区”的动画

程序化滚动(点击后跳到第 N 个分区)走的是scrollAnimate,改animate对它无效:

scrollAnimate = { animations, completion in UIView.animate(withDuration: 1.0, dampingRatio: 0.7, initialSpringVelocity: 0.25, options: [], animations: animations, completion: completion) }

如果只想简单改时长,官方 README 给的最简写法也完全够用:

scrollAnimate = { animations, completion in UIView.animate(withDuration: 1, animations: animations, completion: completion) }

弹性动画参数建议与覆盖时机

参数弹性手感建议区间说明
duration0.6 ~ 1.0 秒太短会让回弹显得生硬
dampingRatio0.5 ~ 0.7越接近 1 回弹越弱
initialSpringVelocity0.25 ~ 0.5决定起始的“冲刺感”

推荐覆盖时机:在你继承 ScrollingStackViewController 的子类viewDidLoad()里、super.viewDidLoad()之后赋值,然后再add(viewController:)添加分区:

override func viewDidLoad() { super.viewDidLoad() animate = { animations, completion in UIView.animate(withDuration: 0.8, dampingRatio: 0.6, initialSpringVelocity: 0.5, options: [], animations: animations, completion: completion) } scrollAnimate = { animations, completion in UIView.animate(withDuration: 1.0, dampingRatio: 0.7, initialSpringVelocity: 0.25, options: [], animations: animations, completion: completion) } add(viewController: child1) }

官方示例工程Example/ScrollingStackViewController/ViewController.swift展示了添加分区、设置spacingColor、调用scrollTo的完整用法,可对照阅读。

常见坑与排查清单

  • ⚠️show/hideanimated: false时不会走animate,而是直接改alphaisHidden——看不出动画效果时先检查这里。
  • ⚠️scrollTo只认scrollAnimate;只改animate不会让滚动变弹。
  • 💡scrollTo在内容高度尚未确定时会自动延迟到布局完成后再执行,不需要手动强制 layout。
  • 💡 闭包第二个参数completion(Bool)用于判断动画是否真正完成,适合串联“滚动到位后再高亮”等后续逻辑。

相关资料速查

  • 核心实现(闭包定义与scrollTo逻辑):ScrollingStackViewController/Classes/ScrollingStackViewController.swift
  • 可运行的演示子类:Example/ScrollingStackViewController/ViewController.swift
  • 用法与安装说明(含动画覆盖示例):README.md

【免费下载链接】ScrollingStackViewControllerA view controller that uses root views of child view controllers as views in a UIStackView.项目地址: https://gitcode.com/gh_mirrors/sc/ScrollingStackViewController

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.cnnetsun.cn/news/4176717.html

相关文章:

  • 炉石HsMod插件:60+功能管换肤、战棋MMR和挂机,Windows 5分钟装好
  • Ditto核心原理(三):motion_stitch缝合网络如何让数字人自然眨眼与表情过渡
  • foreach的隐藏代价:用RoslynClrHeapAllocationAnalyzer揪出引用类型枚举器分配
  • MiroFish群体智能引擎如何快速部署:Docker一键部署与源码安装怎么选
  • 如何把安卓手机投到电脑并直接控制:scrcpy 三步上手
  • 猫抓扩展:网页视频音频一键提取的完整上手指南
  • 深入理解D3.js中的数字格式化工具d3-format
  • 让Claude Scholar从强论文中挖掘知识:paper-miner与kaggle-miner Agent实战
  • SUID3NUM源码解析:一个700行Python脚本如何实现SUID自动提权
  • IP-Adapter-FaceID 人脸一致性出图实战:一张照片到多风格人像
  • iOS悬浮窗通话怎么做?react-native-agora画中画(PiP)完整实现指南
  • Scout-App偏好设置全解析:托盘驻留、声音提醒与桌面通知的3分钟快速配置指南
  • dingo 数据质量评估:给 LLM 训练数据做体检
  • 如何10分钟快速部署Sunshine:从零开始的游戏串流完整指南
  • 如何用LLaMA-Factory微调MiniCPM-o-2_6:全模态模型领域适配完整教程
  • ol-plot 入门使用指南:三步把标绘工具接到 OpenLayers 地图上
  • 浏览器里改暗黑破坏神2存档:用 d2s-editor 快速调属性、导物品的完整指南
  • TrollInstallerX 安装 TrollStore 完整教程:4 步装好,iOS 14.0-16.6.1 通用
  • 快捷键失灵了?3 分钟用 Hotkey Detective 揪出偷走全局热键的进程
  • 3 步跑通 Beyond Compare 5 密钥生成:BCompare_Keygen 零基础上手指南
  • LiteRT-LM视觉能力实战:多模态LLM在树莓派上识别图像完整指南
  • Windows苹果驱动安装完整指南:1分钟让iPhone USB网络共享跑起来
  • 抖音去水印下载完整指南:一条命令保存单个视频或整站主页
  • miqu-1-70b量化版本终极选择指南:q2_K、q4_k_m、q5_K_M三大档深度对比
  • ExplorerPatcher 任务栏属性窗口无法打开:4 层排查阶梯,一文搞定
  • OpenCore Legacy Patcher:老 Mac 升级最新 macOS Sequoia 的完整方法
  • AIMNet2-rxn 局限性与完整解决方案:突破 H/C/N/O 元素限制的化学反应模拟策略
  • Keep:把 20 条告警压成 1 个事件,AIOps 告警关联的开源解法
  • 商用前必看:flux-RealismLora非商业许可证避坑指南与风险解读
  • MouseJiggler 从安装到防休眠:一份完整的 Windows 实用指南