UIHostingController被UIKit导航栈push时导航栏标题动画异常问题
问题原因
该导航栏标题动画异常是UIKit导航转场时机和SwiftUI属性同步逻辑不匹配导致的:
UIKit执行push动画前,会提前读取目标ViewController的title属性用于生成转场动画效果,但SwiftUI的navigationTitle需要等UIHostingController的view完成加载后,才会同步到宿主VC的title属性上,此时转场动画已经启动,就会出现标题无过渡、直接弹出的异常效果。后续通过NavigationLink跳转时导航栈完全由SwiftUI管理,属性同步逻辑和转场时机对齐,所以动画表现正常。
修复方案
- 方案1(最低成本兼容):push前手动给
UIHostingController的title属性赋值,和SwiftUI中设置的navigationTitle保持一致即可
修改pushVC方法代码如下:
@objc private func pushVC() { let vc = UIHostingController(rootView: Content()) // 提前给UIKit层面的VC设置标题,匹配转场动画的读取时机 vc.title = "UIHostingController" self.navigationController?.pushViewController(vc, animated: true) }
- 方案2(统一标题管理):封装自定义
UIHostingController子类,初始化时统一接收标题参数,同时赋值给VC的title属性和SwiftUI的环境变量,避免两端重复写标题。 - 方案3(版本升级修复):将Xcode升级到14及以上版本,苹果在后续版本的SDK中优化了
UIHostingController与UIKit导航栈的适配逻辑,该问题在新系统版本中已被官方修复,旧系统版本仍需手动兼容处理。
内容的提问来源于stack exchange,提问作者Darko
相关产品推荐
相关产品推荐

