[英]How to set custom title view to center of navigation bar
我正在尝试将自定义视图(标签)添加为导航项的标题视图。
但它没有出现在中心
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)
但我需要动态解决方案
任何帮助,将不胜感激
我调试了您的场景,希望对您和其他开发人员有所帮助,
当我们通过在减去项目空间、边距、填充等之后计算剩余空间来分配tittleView 宽度时,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。
希望以上案例让您明白我们的期望和我们得到的内容以及我在第一段中编写的计算,即titleview.x = rightItem.x - width
。
结论 :
如果 rightBarItems 的项目比 leftBarItems 多,则 titleview 将位于中心,因此您无需执行任何操作,但如果 leftBarItems 的项目比 rightBarItems 多,则在右侧添加空白项目以使其平衡。 这对开发人员来说很奇怪,但似乎是唯一的解决方案。
检查最终输出。
如果您的导航项是 UINavigationController 的一部分,您可以尝试self.navigationController?.navigationBar.topItem?.leftBarButtonItem?.width ?? 0.0
self.navigationController?.navigationBar.topItem?.leftBarButtonItem?.width ?? 0.0
根据@dahiya_boy 的回答添加我的版本代码。 就我而言,我有一个宽度超过 30 的自定义按钮。 因此,我没有将它乘以 30,而是从左右项目中找到最大值来找到最大值。 下面是代码:
func setCenterTitle(_ title: String) {
let navWidth = (navigationController?.navigationBar.frame.width).orZero
let leftItemsWidth = leftBarButtonItems.orEmptyArray.reduce(0) {
$0 + ($1.customView?.frame.width).orZero
}
let rightItemsWidth = rightBarButtonItems.orEmptyArray.reduce(0) {
$0 + ($1.customView?.frame.width).orZero
}
let maxItemsWidth = max(leftItemsWidth, rightItemsWidth)
let padding: CGFloat = 40
let labelWidth = navWidth - (maxItemsWidth * 2) - padding
let titleLabel = UILabel(frame: CGRect(x: 0, y: 0, width: labelWidth, height: 40))
titleLabel.text = title
titleLabel.textAlignment = .center
titleLabel.font = UIFont.boldSystemFont(ofSize: 16)
self.titleView = titleLabel
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.