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
相关产品推荐
相关产品推荐

