【问题标题】:How to set custom title view to center of navigation bar如何将自定义标题视图设置为导航栏的中心
【发布时间】:2019-07-08 08:54:24
【问题描述】:

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

但它没有出现在中心

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)

但我需要动态解决方案

任何帮助将不胜感激

【问题讨论】:

  • 你有 UILabel 的子类?
  • @ShahzaibQureshi 是的,它是第三方库。但它是 UILabel 的子类
  • 默认标题视图在中心。
  • @dahiya_boy 我必须为标签设置框架。没有设置框架,我无法看到标签。
  • @PrashantTukadiya 检查我的答案。

标签: ios uinavigationcontroller uinavigationbar uinavigationitem


【解决方案1】:

我调试了你的场景,希望对你和其他开发者有所帮助,

当我们通过计算减去项目空间、边距、填充等空间后的剩余空间来分配 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。


希望上述案例能让您弄清楚我们的预期和得到的结果以及我在第一段中写的计算,即titleview.x = rightItem.x - width

结论:

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

检查最终输出。

  • 查看层次结构

  • 输出

【讨论】:

  • 感谢您的努力,但为什么您对widthOfItempading 采用静态值
  • widthOfItem 是我的特定项目的宽度,我在现场项目中完成了这个,所以我不能透露所有代码,这里我有 4 个项目,每个项目都有 30 个宽度(检查你的场景我正在使用一个).BTW 填充用于第一个 navbarItem 之前的空间。在项目的短前导空间。不知道如何动态计算。项目框架原点始终为零。所以对于 dummy,我将 padding 设为 40。
  • 我害怕使用填充值,因为如果未来版本的 iOS 可能会损坏。
  • 我认为这是CGRect(x: self.view.center.x - 100, y: 0, width: 100 , height: 40) 更安全的一面,并为你的努力点赞
  • 你已经给出了边距值,我不认为它会被打破,否则重晶石会粘在屏幕的最左侧。我使用 CGRect(x: 0, y: 0, width: 100 , height: 40) ,无需计算 x,仍然可以正常工作。我发布了这个答案,但似乎你已经完成了,所以我删除了我之前的答案。
【解决方案2】:

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

【讨论】:

  • 不,还是0
猜你喜欢
  • 2012-01-16
  • 1970-01-01
  • 2013-05-19
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 2013-08-13
  • 1970-01-01
相关资源
最近更新 更多