You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

iOS导航栏隐藏后侧滑返回异常问题解决求助

解决侧滑返回时导航栏显示异常的问题

这个问题我之前也碰到过,核心原因是侧滑返回是一个渐进的交互过程,而你在viewWillDisappear中提前触发了导航栏显示的操作,此时当前控制器还没完全退出屏幕,就会导致视觉上的突兀或异常。下面给你几个实用的解决思路:

方法一:延迟到viewDidDisappear恢复导航栏显示

把恢复导航栏的逻辑从viewWillDisappear移到viewDidDisappear,这样只有当当前控制器完全消失后,导航栏才会显示,侧滑过程中不会提前出现:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    // 传入animated参数,保持动画一致性
    self.navigationController?.setNavigationBarHidden(true, animated: animated)
}

override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    self.navigationController?.setNavigationBarHidden(false, animated: animated)
}

方法二:处理侧滑手势的取消状态

如果用户侧滑到一半又取消返回,viewWillDisappear已经执行过导航栏显示操作,但当前控制器还在界面上,这时候需要重新隐藏导航栏。我们可以监听系统侧滑手势的状态:

override func viewDidLoad() {
    super.viewDidLoad()
    // 获取系统默认的侧滑返回手势
    if let popGesture = navigationController?.interactivePopGestureRecognizer {
        popGesture.addTarget(self, action: #selector(handlePopGesture(_:)))
    }
}

@objc private func handlePopGesture(_ gesture: UIGestureRecognizer) {
    // 当手势取消时,重新隐藏导航栏
    if gesture.state == .cancelled {
        navigationController?.setNavigationBarHidden(true, animated: true)
    }
}

// 保留原来的显示/隐藏逻辑
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.setNavigationBarHidden(true, animated: animated)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    navigationController?.setNavigationBarHidden(false, animated: animated)
}

方法三:用导航控制器代理统一管理(推荐)

这种方式更优雅,把导航栏的显示逻辑统一交给导航控制器的代理处理,避免在每个控制器中重复写代码,也能更好地适配转场动画:

  1. 让你的导航控制器遵循UINavigationControllerDelegate
class YourCustomNavController: UINavigationController, UINavigationControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
    }

    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        // 判断当前要显示的控制器是否需要隐藏导航栏
        let shouldHideNavbar = viewController is FirstViewController
        navigationController.setNavigationBarHidden(shouldHideNavbar, animated: animated)
    }
}
  1. 移除第一个ViewController中关于导航栏的viewWillAppearviewWillDisappear逻辑即可。

这种方法能让导航栏状态和控制器的显示状态完全绑定,不管是正常push/pop还是侧滑返回,都能保证UI的一致性。

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

火山引擎 最新活动