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

iOS开发:键盘消失后UINavigationBar大标题无法恢复问题求助

问题描述

我设置了如下代码来启用大标题导航栏:

if #available(iOS 11.0, *) { 
    navigationController?.navigationBar.prefersLargeTitles = true 
    navigationController?.navigationItem.largeTitleDisplayMode = .never 
}

我的页面有一个包含textFields的UIScrollView,当键盘弹出后我滚动到底部时,UINavigationBar会变为小尺寸,这符合预期。但键盘消失后,UINavigationBar仍然保持小尺寸,我希望键盘消失时导航栏能恢复大标题样式。

现象说明:键盘弹出后滚动scrollView到底部,导航栏变为小尺寸;键盘消失后,导航栏依然保持小尺寸,没有恢复到大标题样式。

状态截图:

  • 正常状态(大标题):
    Normal state
  • 键盘消失后(保持小标题):
    When keyboard dismiss
  • Storyboard布局:
    Storyboard

解决方案

这个问题我之前也碰到过!核心原因是键盘消失后,UIScrollView的contentOffset没有自动回到顶部,导航栏会因为检测到scrollView不在顶部位置,而保持小标题的显示状态。下面给你两种可行的解决办法:

方法1:监听键盘消失通知,强制恢复大标题

通过监听键盘隐藏的系统通知,在键盘消失时让scrollView滚动回顶部,并重置导航栏的大标题配置:

  1. 在viewDidLoad中注册键盘通知:
override func viewDidLoad() {
    super.viewDidLoad()
    // 注册键盘隐藏通知
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}
  1. 实现通知响应方法:
@objc private func keyboardWillHide() {
    // 让scrollView平滑滚动回顶部
    scrollView.setContentOffset(.zero, animated: true)
    // 重置大标题显示模式
    navigationController?.navigationItem.largeTitleDisplayMode = .automatic
    navigationController?.navigationBar.prefersLargeTitles = true
}
  1. 在页面销毁时移除通知监听(避免内存泄漏):
deinit {
    NotificationCenter.default.removeObserver(self)
}

方法2:通过UIScrollViewDelegate动态调整大标题

利用scrollView的滚动代理方法,根据scrollView的滚动位置动态切换大标题显示模式,这样不管是键盘弹出/消失还是手动滚动,都能自动适配:

  1. 先设置scrollView的delegate为当前ViewController:
override func viewDidLoad() {
    super.viewDidLoad()
    scrollView.delegate = self
}
  1. 实现UIScrollViewDelegate的滚动方法:
extension YourViewController: UIScrollViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        // 判断scrollView是否处于顶部位置
        let isScrollAtTop = scrollView.contentOffset.y <= 0
        // 动态设置大标题显示模式
        navigationController?.navigationItem.largeTitleDisplayMode = isScrollAtTop ? .automatic : .never
    }
}

补充说明

你之前设置largeTitleDisplayMode = .never的逻辑,只会在scrollView滚动时触发小标题,但不会自动在scrollView回到顶部时恢复大标题。通过上面两种方法,要么主动让scrollView回到顶部并重置配置,要么根据滚动位置动态调整,就能解决键盘消失后导航栏不恢复的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:27:52