Swift4中使用LargeTitleBar时导航栏返回按钮标题消失问题求助
解决Swift 4中Large Title导航栏标题截断导致返回按钮标题消失的问题
我之前也碰到过类似的坑——UIKit在Large Title模式下为了节省导航栏空间,当主标题过长被截断时,会自动隐藏返回按钮的标题,不同设备因为屏幕宽度不同,触发的字符长度阈值也不一样(你提到的iPhone SE 20字节、iPhone X 22字节就是典型的例子)。下面给你几个可行的解决思路:
方案1:强制锁定返回按钮标题
直接自定义返回按钮,或者显式设置返回按钮的标题,不让UIKit自动调整。比如在当前控制器的viewDidLoad里添加:
// 方法1:设置返回按钮的固定标题 navigationItem.backBarButtonItem = UIBarButtonItem(title: "返回", style: .plain, target: nil, action: nil) // 方法2:如果是上一个控制器,在跳转前设置它的backBarButtonItem // 比如在A控制器跳转到B控制器前: let bVC = BViewController() navigationItem.backBarButtonItem = UIBarButtonItem(title: "A页面", style: .plain, target: nil, action: nil) navigationController?.pushViewController(bVC, animated: true)
这个方法的核心是显式指定返回按钮的标题,绕过UIKit的自动隐藏逻辑。
方案2:避免主标题被截断
如果希望保留Large Title的原生样式,同时不让标题截断,可以尝试调整标题的显示规则:
- 调整Large Title的字体大小:
if let font = UIFont.preferredFont(forTextStyle: .largeTitle).withSize(28) { UINavigationBar.appearance().largeTitleTextAttributes = [.font: font] }
缩小字体后,标题能容纳更多字符,自然不会触发截断逻辑。
- 自定义标题视图,支持多行显示:
把navigationBar的titleView换成一个UILabel,开启多行显示:
let titleLabel = UILabel() titleLabel.text = someText titleLabel.numberOfLines = 0 titleLabel.textAlignment = .center titleLabel.font = UIFont.preferredFont(forTextStyle: .largeTitle) navigationItem.titleView = titleLabel
这样标题会自动换行,不会被截断,也就不会触发返回按钮标题消失的问题。
方案3:利用UIKit的布局回调强制恢复返回按钮
如果上面的方法都不适用,可以在控制器的布局回调里强制设置返回按钮标题,比如在viewWillLayoutSubviews中:
override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() // 确保返回按钮标题始终存在 navigationItem.backBarButtonItem?.title = "你的返回标题" // 或者直接重置返回按钮 let backButton = UIBarButtonItem(image: UIImage(named: "back_icon"), style: .plain, target: self, action: #selector(backAction)) navigationItem.leftBarButtonItem = backButton } @objc func backAction() { navigationController?.popViewController(animated: true) }
这个方法比较“粗暴”但胜在有效,适合需要完全自定义返回按钮样式的场景。
内容的提问来源于stack exchange,提问作者Tarou
相关产品推荐
相关产品推荐

