You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

setNavigationBarHidden方法在iOS 15系统下失效该如何解决?

iOS 15 setNavigationBarHidden 失效解决方案

问题根因

iOS 15 调整了 UINavigationController 对导航栏显隐状态的管理逻辑,单独在跳转后页面的 viewWillAppear 中调用隐藏方法时,会出现导航控制器状态同步时序问题,导致方法失效。混用 setNavigationBarHidden(_:animated:) 和 navigationBar.isHidden 会进一步加剧状态冲突,导致过渡动画卡顿。

可行解决方案

方案1:双页面状态配对管理(适配90%以上场景)

分别在两个关联的 ViewController 中配对实现导航栏显隐调用,不要仅在第二个页面单独设置:

  • 第一个需要显示导航栏的 ViewController 新增代码:
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    // 从第二个页面返回时自动恢复导航栏显示
    navigationController?.setNavigationBarHidden(false, animated: animated)
}
  • 第二个需要隐藏导航栏的 ViewController 新增代码:
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.setNavigationBarHidden(true, animated: animated)
}

// 可选:适配侧滑返回中断场景,避免状态异常
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    if isMovingFromParent {
        navigationController?.setNavigationBarHidden(false, animated: animated)
    }
}

方案2:转场协调器兜底适配

如果方案1存在偶现失效,可使用转场协调器绑定动画生命周期,确保显隐操作和push/pop动画完全同步:
第二个页面的代码调整为:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    transitionCoordinator?.animate(alongsideTransition: { [weak self] _ in
        self?.navigationController?.setNavigationBarHidden(true, animated: animated)
    }, completion: { [weak self] context in
        // 转场被中断时恢复状态
        if context.isCancelled {
            self?.navigationController?.setNavigationBarHidden(false, animated: false)
        }
    })
}

注意事项

  • 全程不要混用 setNavigationBarHidden(_:animated:) 和 navigationBar.isHidden 两种设置方式,会导致导航栏状态管理冲突
  • 如果使用了自定义导航栏外观,需要同步配置iOS15新增的 standardAppearance 和 scrollEdgeAppearance 属性,避免半透明/透明状态异常导致的视觉卡顿

内容的提问来源于stack exchange,提问作者Libreage

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 07:24:02