ios - 如何将自定义标题视图设置为导航栏的中心
问题描述
我正在尝试添加自定义视图(标签)作为导航项的标题视图。
但它没有出现在中心
func setupNavigationMultilineTitle(title:String) {
let autoscrollLabel = EFAutoScrollLabel()
autoscrollLabel.text = title
autoscrollLabel.textAlignment = .center
autoscrollLabel.backgroundColor = .red
autoscrollLabel.font = AppTheme.Fonts.font(type: .Medium, size: 15)
autoscrollLabel.textColor = AppTheme.Colors.ColorsOfApp.header_color.color
autoscrollLabel.frame = CGRect(x: 0, y: 0, width:((self.navigationController?.navigationBar.frame.size.width ?? 0) - (self.navigationItem.leftBarButtonItem?.customView?.frame.width ?? 0) * 2) , height: 40)
self.navigationItem.titleView = autoscrollLabel
}
我曾尝试使用自定义视图的扣除宽度将其显示在中心,但不幸的是它不起作用。
我也尝试过,self.navigationItem.leftBarButtonItem.width
但它返回 0。我确认有 leftBarbutton 项目 po self.navigationItem.leftBarButtonItem
编辑
这解决了问题
autoscrollLabel.frame = CGRect(x: self.view.center.x - 125, y: 0, width: 250 , height: 40)
但我需要动态解决方案
任何帮助,将不胜感激
解决方案
我调试了您的场景,希望它可以帮助您和其他开发人员,
当我们通过计算减去项目空间、边距、填充等空间后剩余的空间来分配 titleView 宽度时,iOS 会从右侧计算 titleView X,即titleview.x = rightItem.x - width
我们期望它像titleview.x = navbar.width/2 - width/2
.
请看下面的示例测试用例。
计算宽度
let maxItemOnEitherSide = max(arrLeftItems.count, arrRightItems.count)
let widthOfItem : CGFloat = 30.0
let pading : CGFloat = 40
let aWidth : CGFloat = (self.navigationController?.navigationBar.frame.width)! - CGFloat(maxItemOnEitherSide) * widthOfItem * 2.0 - pading
let lblNavTitle = UILabel(frame: CGRect(x: 0, y: 0,
width: aWidth,
height: 40))
案例 1: arrLeftItems.count = 1 和 arrRightItems.count = 0。
输出 :
案例 2: arrLeftItems.count = 0 和 arrRightItems.count = 1。
希望上述案例能让您清楚我们所期望的、我们得到的以及我在第一段 ie 中写的计算titleview.x = rightItem.x - width
。
结论 :
如果 rightBarItems 的项目多于 leftBarItems,则 titleview 将位于中心,因此您无需执行任何操作,但如果 leftBarItems 的项目多于 rightBarItems,则在右侧添加空白项目以使其平衡。这对开发人员来说很奇怪,但似乎是唯一的解决方案。
检查最终输出。
- 查看层次结构
- 输出
推荐阅读
- python - 使用 python sqlalchemy 从本地 Postgres 数据库中检索数据
- java - admob 测试广告未显示 upp
- python - 在一行中显示两个值
- python-3.x - 在长时间运行的 Python 脚本中将每个项目写入文件?
- reactjs - reactjs - 如何将用户文本输入数据存储到一个对象内部的数组中?
- javascript - 禁用 html 样式的复制
- c++ - 将值分配给二维数组的最优化方法是什么?
- javascript - 当元素不是 iset javascript 时添加事件侦听器单击
- ios - 导航视图移动了我的目标视图 SwiftUI
- r - 按月份和年份对列名进行排序