如何将自定义标题视图设置为导航栏的中心

时间:2019-02-14 10:46:20

标签: ios uinavigationcontroller uinavigationbar uinavigationitem

我正在尝试将自定义视图(标签)添加为导航项的标题视图。

但它没有出现在中心

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。我确认存在带有po self.navigationItem.leftBarButtonItem的leftBarbutton项

编辑

这解决了问题

    autoscrollLabel.frame = CGRect(x: self.view.center.x - 125, y: 0, width: 250 , height: 40)

但是我需要动态解决方案

enter image description here

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

我调试了您的方案,希望对您和其他开发人员有帮助,

当我们通过计算减去项目,边距,填充等的空间后剩下的空间来分配tittleView宽度时,iOS会从右侧(即titleview.x = rightItem.x - width)计算titleView X,我们期望它像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。

输出:

enter image description here

案例2: arrLeftItems.count = 0和arrRightItems.count = 1。

enter image description here


希望上述情况可以使您清楚我们所期望的,得到的以及我在第一段titleview.x = rightItem.x - width中编写的计算结果。

结论:

如果rightBarItems的项目多于leftBarItems,则titleview将居中,因此您无需执行任何操作,但如果leftBarItems的项目比rightBarItems多,则在右侧添加空白项目以使其平衡。对于开发人员来说很奇怪,但似乎是唯一的解决方案。

检查最终输出。

  • 查看层次结构

enter image description here

  • 输出

enter image description here

答案 1 :(得分:0)

如果导航项是UINavigationController的一部分,则可以尝试 self.navigationController?.navigationBar.topItem?.leftBarButtonItem?.width ?? 0.0