如何使用iOS Swift Hero框架实现ViewController间转场?含具体场景需求
你说的Shared Element Transition完全没错,iOS原生里对应的是UISharedElementTransition,用Hero库来实现这种转场确实是最优选择之一——它能帮你省去原生转场里一堆繁琐的代理代码,几行配置就能搞定丝滑的过渡效果。
使用Hero Library实现共享元素转场
核心实现步骤
- 第一步:给两个页面中需要共享的图片视图设置相同的
hero.id。比如在TableViewController的cell图片上:
然后在// 在cell配置方法里 cell.imageView.hero.id = "sharedImage_\(indexPath.row)"DetailViewController的大图视图上:// 假设你传了选中的index过来 detailImageView.hero.id = "sharedImage_\(selectedIndex)" - 第二步:开启Hero的转场支持。最简单的方式是给导航控制器全局启用:
// 在AppDelegate或者TableViewController的viewDidLoad里 navigationController?.hero.isEnabled = true - 第三步(可选):自定义过渡效果。如果想要更细腻的动画,比如缩放+淡入,可以给视图添加
hero.modifiers:// 给详情页的图片加个初始缩放效果 detailImageView.hero.modifiers = [.scale(0.8), .fade]
项目参考方向
你可以快速搭一个Demo项目验证,结构如下:
- 一个
UITableViewController,每个cell包含一个UIImageView(加载本地图或网络图都可以) - 一个
DetailViewController,包含一个大尺寸的UIImageView(比如铺满整个屏幕) - 通过CocoaPods或Swift Package Manager导入Hero库
- 实现TableView的
didSelectRowAt方法,正常push到DetailVC即可——Hero会自动识别相同hero.id的元素,完成共享过渡
另外,Hero库自带的示例工程里就有列表到详情页的共享元素转场案例,你可以直接查看它的示例代码,里面还包含了各种进阶转场效果的实现,非常值得参考。
原生方案替代(无第三方库)
如果不想依赖第三方库,也可以用iOS原生API实现:
- 给导航控制器设置
transitioningDelegate,实现animationController(forPresented:presenting:source:)方法,返回自定义的转场动画器 - 在自定义动画器中,通过
UISharedElementTransitionContext获取共享元素的起始/结束frame,用UIView.animate实现缩放、位移过渡 - 还要处理转场过程中的遮罩、透明度等细节,相对Hero会繁琐不少,但好处是无外部依赖
内容的提问来源于stack exchange,提问作者amirtmgr
相关产品推荐
相关产品推荐

