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

iOS使用自定义字体时返回按钮文本被截断的问题

解决自定义字体下返回按钮文本左侧截断的问题

嗨,这个问题我之前做项目的时候也踩过坑!核心原因是你找错了配置返回按钮的地方——跳转后的返回按钮,其实是由发起跳转的源视图控制器的navigationItem.backBarButtonItem控制的,不是目标视图控制器的。你在prepare(for:sender:)里修改目标VC的backBarButtonItem,不仅不会生效,甚至这个对象此时可能还没被系统初始化呢。

先还原下你的问题现象:

  • 异常情况:返回按钮的文本左侧被截断,文字和按钮左边界紧紧贴在一起,只能看到部分内容
  • 正常预期:返回按钮文本完整显示,左侧有合适的留白

正确的解决方案

给你几个可行的处理方式,按推荐优先级排序:

1. 在源视图控制器中配置返回按钮

直接在发起跳转的第一个视图控制器的viewDidLoad里,设置自己的navigationItem.backBarButtonItem,同时搞定自定义字体和位置调整:

override func viewDidLoad() {
    super.viewDidLoad()
    
    // 创建自定义返回按钮
    let backButton = UIBarButtonItem(title: "Back", style: .plain, target: nil, action: nil)
    // 设置你的自定义字体
    backButton.setTitleTextAttributes([
        NSAttributedString.Key.font: UIFont(name: "你的自定义字体名称", size: 17)!
    ], for: .normal)
    // 给左侧留出足够空间,调整标题位置
    backButton.setTitlePositionAdjustment(UIOffset(horizontal: 10, vertical: 0), for: .default)
    
    // 把配置好的按钮赋值给源VC的backBarButtonItem
    navigationItem.backBarButtonItem = backButton
}

这样跳转后,目标VC的返回按钮就会用这个配置好的按钮,文本自然不会被截断了。

2. 全局统一调整导航栏标题偏移

如果你的APP里所有返回按钮都需要这个调整,可以直接全局设置UINavigationBar的样式,省得每个VC都单独配置:

// 可以放在AppDelegate或者SceneDelegate的初始化方法里
UINavigationBar.appearance().titlePositionAdjustment = UIOffset(horizontal: 10, vertical: 0)
// 同时设置全局自定义字体
UINavigationBar.appearance().titleTextAttributes = [
    NSAttributedString.Key.font: UIFont(name: "你的自定义字体名称", size: 17)!
]

3. 排查自定义字体本身的问题

有些自定义字体本身的字形左右边距设计得比较紧凑,哪怕调整了位置还是会截断。这种情况下,你可以试试给字体加字间距,或者用富文本做偏移修正:

// 用富文本设置标题,同时调整字间距
let attributedTitle = NSAttributedString(string: "Back", attributes: [
    NSAttributedString.Key.font: UIFont(name: "你的自定义字体名称", size: 17)!,
    NSAttributedString.Key.kern: 0.5, // 微调字间距,根据实际情况调整数值
    NSAttributedString.Key.baselineOffset: 0 // 可选:如果字体上下偏移也有问题,调整这个值
])
let backButton = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
backButton.setAttributedTitle(attributedTitle, for: .normal)
navigationItem.backBarButtonItem = backButton

为什么你原来的代码不生效?

你在prepare(for:sender:)里修改viewController.navigationItem.backBarButtonItem,但实际上:

  • 目标VC的返回按钮是由源VC的backBarButtonItem决定的,目标VC自己的这个属性根本不会被系统使用
  • 跳转前目标VC的navigationItem.backBarButtonItem还没被系统初始化,所以调用setTitlePositionAdjustment也不会有任何效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:39:54