导航栏大标题过长被截断,如何不改大小实现多行显示?
实现导航栏大标题多行显示(不改变字号)
方案一:自定义导航栏标题视图
系统默认大标题为单行截断逻辑,可通过自定义UILabel作为导航栏标题视图实现多行显示:
- 创建
UILabel并设置numberOfLines = 0,保留系统大标题字号(可通过UIFont.preferredFont(forTextStyle: .largeTitle)获取默认大标题字体) - 将自定义label赋值给
navigationItem.titleView - 确保label宽度适配导航栏可用空间,触发自动换行
示例代码:
// 在ViewController的viewDidLoad方法中实现 let titleLabel = UILabel() titleLabel.text = "你的超长标题文本内容" titleLabel.font = UIFont.preferredFont(forTextStyle: .largeTitle) titleLabel.numberOfLines = 0 titleLabel.textAlignment = .center titleLabel.sizeToFit() navigationItem.titleView = titleLabel
方案二:通过KVC修改系统大标题Label属性
若不想完全自定义标题视图,可尝试通过KVC获取系统内部的大标题Label,修改其行数限制:
注意:该方法依赖系统私有结构,iOS版本更新可能导致失效,需做好兼容性测试
示例代码:
// 在ViewController的viewDidAppear方法中调用(确保导航栏已完成加载) if let navigationBar = navigationController?.navigationBar, let largeTitleLabel = navigationBar.value(forKey: "_largeTitleLabel") as? UILabel { largeTitleLabel.numberOfLines = 0 largeTitleLabel.sizeToFit() navigationBar.layoutSubviews() }
注意事项
- 自定义标题视图时,需适配不同设备的导航栏宽度,保证label自动换行逻辑正常
- 使用KVC方案时,需针对目标iOS版本做测试,避免系统更新后出现崩溃
- 两种方案均保留大标题原始字号,满足不改变标题尺寸的需求
内容的提问来源于stack exchange,提问作者Nicolas
相关产品推荐
相关产品推荐

