首页 > 解决方案 > 如何将自定义标题视图设置为导航栏的中心

问题描述

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

但它没有出现在中心

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)

但我需要动态解决方案

在此处输入图像描述

任何帮助,将不胜感激

标签: iosuinavigationcontrolleruinavigationbaruinavigationitem

解决方案


我调试了您的场景,希望它可以帮助您和其他开发人员,

当我们通过计算减去项目空间、边距、填充等空间后剩余的空间来分配 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,则在右侧添加空白项目以使其平衡。这对开发人员来说很奇怪,但似乎是唯一的解决方案。

检查最终输出。

  • 查看层次结构

在此处输入图像描述

  • 输出

在此处输入图像描述


推荐阅读