Swift 导航控制器大标题调整:如何与右侧栏按钮显示在同一行
实现导航栏大标题与右侧栏按钮同屏显示的最优方案
原代码失效原因
你调用的setTitlePositionAdjustment方法仅用于调整右栏按钮自身文字的相对偏移,无法修改系统大标题的布局位置:系统大标题模式下,导航栏默认将大标题放在独立的底部区域,和顶部的栏按钮不属于同一布局层级,因此无法通过调整按钮偏移实现同行。
方案1:关闭大标题模式(最推荐,兼容性最好)
如果不需要滚动时的大标题折叠交互,直接关闭当前页的大标题显示即可,系统默认普通标题和右栏按钮同行:
// 关闭当前页面大标题显示,不影响其他页面的大标题配置 navigationItem.largeTitleDisplayMode = .never // 直接设置导航栏标题即可 navigationItem.title = NSLocalizedString("Discover", comment: "").localized(lang)
如果需要保留和大标题一样的字体大小,参考方案2。
方案2:自定义titleView(保留大字体效果)
通过自定义导航栏的titleView,直接把大字号的标题控件放在和右按钮同级的布局层,天然实现同行显示:
// 1. 创建自定义标题标签,配置和系统大标题一致的样式 let titleLabel = UILabel() titleLabel.text = NSLocalizedString("Discover", comment: "").localized(lang) titleLabel.font = .systemFont(ofSize: 34, weight: .bold) titleLabel.textColor = .label titleLabel.sizeToFit() // 2. 赋值给navigationItem的titleView navigationItem.titleView = titleLabel // 3. 关闭当前页大标题模式 navigationItem.largeTitleDisplayMode = .never
如果需要左对齐标题,可给titleLabel套一层父视图,调整父视图的frame实现左偏移即可。
不推荐方案:修改导航栏子视图布局
如果必须保留系统大标题的折叠动画效果,只能遍历UINavigationBar的子视图修改大标题控件的frame,但该方案依赖iOS系统内部视图结构,不同系统版本可能失效,稳定性差。
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

