繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM