
Hero 开源库 CHANGELOG 深度解读从 1.3.0 到 1.6.3 的版本演进与核心源码实现【免费下载链接】HeroElegant transition library for iOS tvOS项目地址: https://gitcode.com/gh_mirrors/he/HeroHero 是面向 iOS 与 tvOS 的优雅转场动画库提供在 UIKit 复杂转场 API 之上的声明式封装Hero.podspec。本文以仓库根目录 CHANGELOG.md 为脉络逐版本梳理 Hero 从 1.3.0 到 1.6.3 的关键变更并结合 Sources 目录下的真实实现解释每个里程碑背后的设计动机与工作原理。读完本文你将理解 Hero 的快照snapshot机制、自定义转场 API 的演进、Swift 生态适配路径以及如何在升级版本时评估对自身项目的影响。版本演进总览Hero 的四个关键阶段从 CHANGELOG 可以清晰看出 Hero 的能力迭代分为四个阶段版本区间阶段主题代表性能力1.3.0 – 1.3.1转场 API 完善期completion 回调、delegate 链式转发、阴影与闪烁修复1.4.0 – 1.5.0语言与快照优化期Swift 4.2、自定义快照协议、RTL 语言支持1.6.0生态现代化里程碑Swift 5、Swift Package Manager、SwiftUI 支持1.6.1 – 1.6.3稳定性与平台扩展期Xcode 14 警告修复、anchorPoint 支持、visionOS 适配下面按版本号逐一深入。1.6.3visionOS 适配与 CI/CD 修复1.6.3 的核心提交是 Adaption for visionOS使 Hero 可以在 visionOS 平台构建。对应源码中可见的平台条件编译例如 HeroTransitionUITabBarControllerDelegate.swift 中使用#if !os(visionOS)包裹相关逻辑说明 Tab Bar 相关的 UIKit 转场协议在 visionOS 上不可用需要条件编译隔离。同时该版本修复了 CI 构建矩阵build.yml、test.yml更新 GitHub runner 环境、处理 Xcode 14.0 引入的编译警告Fix build warnings with Xcode 14.0、Fix lint warnings并在 README 中补充了 API 文档链接与平台徽章。对于使用 Swift Package Manager 集成的用户该版本与 Package.swift 声明的平台要求一致——iOS 10.0 与 tvOS 10.0。1.6.2anchorPoint 支持与构建警告清理1.6.2 修复了 #717、#734、#735、#736、#739、#740 等多期 issue并解决 Xcode 13.4.1 构建警告问题。其中最重要的功能变更是#742为转场添加anchorPoint支持。anchorPoint 在源码中的落地anchorPoint已正式成为 Hero 目标状态target state的可配置属性。在 HeroTargetState.swift 中public var anchorPoint: CGPoint?该属性在转场匹配预处理阶段被自动设置。SourcePreprocessor.swift 中有如下逻辑if view.layer.anchorPoint ! targetView.layer.anchorPoint { state.anchorPoint targetView.layer.anchorPoint }即在两个视图通过 heroID 配对时如果源视图与目标视图的layer.anchorPoint不一致Hero 会把目标视图的 anchorPoint 写入目标状态从而保证旋转、缩放等基于锚点的变换在转场中表现正确。同时HeroContext.swift 在生成快照时也会显式同步锚点snapshot.layer.anchorPoint view.layer.anchorPoint snapshot.layer.position containerView.convert(view.layer.position, from: superview)快照系统与 anchorPoint 的配合这段代码所在的snapshotView(for:)是 Hero 转场的核心它先把源视图的圆角、透明度、阴影临时归零按 HeroSnapshotType 生成快照再把圆角、阴影、边框、zPosition、锚点等图层属性原样拷贝到快照层上最后隐藏原视图并让快照参与动画。这也解释了为什么自定义anchorPoint的视图如做旋转动画的卡片在旧版本中会出现转场错位——快照层没有继承锚点1.6.2 正是补齐了这一环。1.6.1依赖与文档维护1.6.1 是维护型版本将 CI 依赖迁移到 Mintcloses #703 Move CI depends to Mint对应仓库根目录的 Mintfile 与 Makefile修复 SPM 缺失导入问题#704、清理 README 死链#708并将文档中 Material Design 的动效时长与缓动链接更新为最新地址。1.6.0Swift 5、SPM、SwiftUI 与扩展目标支持1.6.0 是 Hero 生态现代化的分水岭四项重要能力在同版本落地Swift 5 支持#695Hero.podspec 中s.swift_version 5.0Package.swift 声明swiftLanguageVersions: [.v5]源码全面切换到 Swift 5 语法Swift Package Manager 支持#628仓库新增 Package.swift定义Hero库 targetpath 指向Sources与HeroTests测试 targetpath 指向Tests平台限定.tvOS(.v10)与.iOS(.v10)SwiftUI 支持#623新增 SwiftUIMatchExample.swift 示例通过UIHostingController把 SwiftUI 视图嵌入 Hero 转场体系演示了列表到详情页的 hero 匹配动画App Extension 目标支持#681使 Hero 可用于 Today Widget 等 extension 场景。交互控制 API 的演进1.6.0 还修复了三个行为问题从中可以看到 Hero 交互模型的细节#585replaceViewControllers现在会调用 completion——转场结束时 completion 一定会被触发#559从当前进度恢复 property animator——交互转场中途释放手指后动画从当前 fraction 继续而非从头开始#465键盘转场修复——输入框切换场景下的布局跳动问题。1.5.0自定义快照协议与 RTL 支持1.5.0 引入了两个值得深入理解的能力均由 ManueGE 贡献。HeroCustomSnapshotView让视图自定义自己的快照新增协议HeroCustomSnapshotView在 HeroContext.swift 中定义/// Allows a view to create their own custom snapshot when using **Optimized** snapshot public protocol HeroCustomSnapshotView { var heroSnapshot: UIView? { get } }快照生成时只要视图采用.optimized默认快照类型Hero 就会优先询问视图自身的快照HeroContext.swiftif let customSnapshotView view as? HeroCustomSnapshotView, let snapshotView customSnapshotView.heroSnapshot { snapshot snapshotView }这解决了一个真实痛点.optimized快照为不同类型视图做了差异化优化如无子视图的UIImageView直接克隆 image、半透明UINavigationBar剥离背景再快照、UIStackView走慢速渲染但对带有 mask 或复杂自绘内容的视图优化快照可能与真实外观不一致。此时让视图通过该协议提供自定义快照能保证转场视觉完全正确。RTL 语言支持#520为从右向左书写的语言如阿拉伯语、希伯来语添加支持转场方向逻辑不再硬编码为从左到右。这与 HeroTransition.swift 中defaultAnimationDirectionStrategy: HeroDefaultAnimationType.Strategy .forceLeftToRight的默认策略互为补充——默认强制 LTR但 RTL 环境下可配置适配。另外 #521 让UIImageView的优化快照开始考虑子视图的隐藏状态仅当view.subviews.filter({!$0.isHidden}).isEmpty时才走克隆 image的快速路径HeroContext.swift避免遗漏隐藏子视图导致快照与真实视图不一致。1.4.0Swift 4.2 支持1.4.0 由 rennarda 的 PR #534 引入 Swift 4.2 支持。这是 Swift 语言演进与 iOS 生态兼容性同步的常规步骤为后续 1.6.0 的 Swift 5 迁移铺平道路。Swift 4.2 时代的 API 命名习惯如hero.dismissViewController()、hero.replaceViewController(with:)至今仍保留在 UIViewControllerHero.swift 中只是通过available(*, renamed:)与available(*, deprecated, renamed:)做了版本兼容标注。1.3.1 与 1.3.0completion 回调与内存管理修复1.3.1修复 retain cycle#516 修复了因强引用previousNavigationDelegate与previousTabBarDelegate导致的内存泄漏。对应实现中这两个 delegate 被声明为weakUIViewControllerHero.swiftweak var previousNavigationDelegate: UINavigationControllerDelegate? weak var previousTabBarDelegate: UITabBarControllerDelegate?Hero 接管导航/标签转场时会把原来的 delegate 暂存转场结束或hero.isEnabled false时还原同一文件 L76-L96。如果这里用强引用代理链就可能形成循环引用导致 VC 无法释放。1.3.0completion 参数与 delegate 转发#456dismissViewController与replaceViewController增加可选 completion 参数。在 UIViewControllerHero.swift 中dismissViewController(completion:)会智能判断如果当前 VC 在 Navigation Controller 栈中则执行popViewController(animated:)否则执行dismiss(animated:completion:)replaceViewController(with:completion:)则分三种场景替换——Navigation 栈顶、present 层级、UIWindow 根控制器#430允许前一个UINavigationControllerdelegate 继续处理 delegate 事件。见 HeroTransitionUINavigationControllerDelegate.swiftHero 转发willShow/didShow给原始 delegate避免接管后原有业务逻辑失效#440修复快照裁切阴影。快照生成时阴影属性会被临时清零再恢复HeroContext.swift1.3.0 完善了恢复逻辑保证带阴影的视图快照不会把阴影裁掉f4dab9修复 CALayer 动画闪烁解决CALayer动画在转场首帧的闪烁问题。升级视角completion 在源码中的完整生命周期1.3.0 引入、1.6.0 修复的 completion 机制是理解 Hero 转场收敛逻辑的钥匙。completion 由HeroTransition持有并统一回调转场启动时HeroTransitionCustomTransition.swift 把用户 completion 包装进completionCallback转场结束时HeroTransitionComplete.swift 的complete(finished:)在清理所有临时状态快照、动画器、progress 观察者之后调用completionCallback?(finished)L128状态机在complete末尾复位到.possiblestate .possibleisTransitioning重新变为false。因此replaceViewController中会先检查hero.isTransitioning若转场进行中则拒绝执行并提示先用Hero.shared.cancel(animated:false)或Hero.shared.end(animated:false)结束当前转场UIViewControllerHero.swift。这也是 1.6.0 #585 修复的意义以往 completion 在某些替换场景不会触发升级后可以在 completion 里可靠地执行后续业务逻辑。配套示例与验证资源如需在实践中观察这些能力仓库提供了两代示例工程ExamplesSwift 5 时代SwiftUIMatchExample.swift 演示 SwiftUI 转场MatchExample.swift、MatchInCollectionExample.swift 演示 hero 匹配动画AppStoreCardExample.swift 演示卡片式转场BuiltInTransitionExample.swift 演示内置转场类型LegacyExamplesStoryboard 驱动的历史示例AppleHomePage、CityGuide、ImageGallery、ListToGrid、VideoPlayer 等适合对照 1.6.0 之前的 API 形态Tests/HeroTests.swift覆盖字符串式 modifier 的解析器Lexer Parser可验证fade()、scale(0.5) translate(200, 0)这类声明式转场语法。版本验证上Hero.podspec 的s.version 1.6.3与 CHANGELOG 最新版本一致可直接作为集成校验点CocoaPods 用户应看到 1.6.3SPM 用户则以 Package.swift 与 git tag 为准。结语CHANGELOG 折射出的工程演进逻辑回看这份 CHANGELOGHero 的演进路径清晰可循先用 completion 与 delegate 转发完善 API 的可编程性1.3.x再通过自定义快照协议解决真实视图的渲染保真问题1.5.0随后借助 Swift 5、SPM、SwiftUI 融入现代 Swift 生态1.6.0最后以 anchorPoint 支持、Xcode 新版本适配与 visionOS 适配完成跨平台与稳定性收尾1.6.2 – 1.6.3。对于仍在评估或正在升级 Hero 的开发者这份 CHANGELOG 既是一份变更清单也是一份浓缩的架构设计文档——结合 Sources 阅读能比单纯追版本号获得更多可复用的转场实现经验。【免费下载链接】HeroElegant transition library for iOS tvOS项目地址: https://gitcode.com/gh_mirrors/he/Hero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考