导航栏标题视图对齐

Posted

技术标签:

【中文标题】导航栏标题视图对齐【英文标题】:Navigation bar titleView alignment 【发布时间】:2015-07-05 00:10:24 【问题描述】:

我希望我的导航栏在中间显示两件事。其中一个是列表名称,另一个是用户名。用户名将放在列表名称下。到目前为止我所做的是,我以编程方式创建了两个标签和一个超级视图,并设置了navigationItemtitleView

override func viewDidLoad() 
        super.viewDidLoad()
        var rectForView = CGRect(x: 0, y: 0, width: 190, height: 176)
        var viewForTitle = UIView(frame: rectForView)

        var rectForNameLabel = CGRect(x: 0, y: 63, width: 190, height: 30)
        var listNameLabel = UILabel(frame: rectForNameLabel)
        listNameLabel.text = "Name of the List...."
        listNameLabel.textAlignment = NSTextAlignment.Center
        listNameLabel.font = UIFont(name: "HelveticaNeue-Bold", size: 15)

        var rectForListLabel = CGRect(x: 0, y: 93, width: 190, height: 20)
        var usersOfListLabel = UILabel(frame: rectForListLabel)
        usersOfListLabel.text = "some Users...."
        usersOfListLabel.textAlignment = NSTextAlignment.Center
        usersOfListLabel.font = UIFont(name: "HelveticaNeue", size: 10)

        viewForTitle.addSubview(listNameLabel)
        viewForTitle.addSubview(usersOfListLabel)


        self.navigationItem.titleView = viewForTitle

问题是,我随机选择宽度,这会导致不同设备出现对齐问题。在我的情况下如何实现中间对齐?

【问题讨论】:

您是否尝试为 CenterX 设置 NSLayoutConstraint? 我没有。但我试图将“textForViews”中心x变量设置为视图(控制器附带)中心x变量 顺便说一下如何以编程方式添加约束? 在 viewDidload 中尝试了一个: var constX = NSLayoutConstraint(item: viewForTitle, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant : 0) viewForTitle.addConstraint(constX) ........ 但是没用。程序崩溃。它说“视图层次结构没有为约束做好准备: 在添加为子视图后激活约束? 【参考方案1】:

方法:

titleView 始终居中 因此,请将自定义视图的宽度设置为与 navigationBar 的宽度匹配(宽度 -40)

代码

private func setupNavigationItems() 
    
    let label = UILabel()
    
    label.translatesAutoresizingMaskIntoConstraints = false
    
    label.text = "aaaaa"
    label.backgroundColor = .green
    
    label.textAlignment = .left
    
    navigationItem.titleView = label
    
    if let navigationBar = navigationController?.navigationBar 
        
        label.widthAnchor.constraint(equalTo: navigationBar.widthAnchor, constant: -40).isActive = true
    

【讨论】:

你拯救了我的一天!非常感谢。【参考方案2】:

问题是,导航 titleView 总是试图使您的视图居中。您在较小的屏幕上看到的标题偏离中心的原因是,您的自定义 titleView 的宽度已经超出了 titleView 的最大宽度。

如果您将该值设置为 160,您将看到它在第二种情况下居中。

一般解决方案

如果您想使标题宽度适应不同的设备,有一些方法可以帮助您解决问题。

    根据不同的屏幕宽度设置不同的宽度。例如屏幕宽度为 320 时,设置不超过 160。如果大于 320,则根据不同的屏幕尺寸进行赋值。这不是一个优雅的解决方案,但非常简单,无需费力设置和尝试复杂的约束。

    计算titleView的实际宽度。 titleView 的宽度由导航栏宽度减去左右 barbuttonitem 决定。像

TitleViewWidth = 导航宽度 - leftbarbuttonitem.width +/- rightbarbuttonitem.width - someConstant

您需要进行一些实验才能找到适合该公式的适当常数。

    为此titleView创建一个xib文件,设置约束比要求固定宽度更灵活。从 xib 加载视图,然后分配给 titleView。这可能需要更长的时间来调整它以使其正常工作。

编辑

如果您是新手,我想另一种可能对您来说更容易的方法。

在情节提要中,找到一个视图并将其拖放到此视图控制器的导航栏 titleView 区域。

无论您希望视图有多长,都可以展开。

将两个标签拖放到该视图,并设置前导和尾随以及高度和垂直约束。

它在故事板上的样子

如何在4S上运行

【讨论】:

我想到了类似于 1 中提到的解决方案。但我不知道我该怎么做...如何为不同的设备或屏幕设置不同的数量?对于数字 3,我不知道如何创建 xib 文件。我是 ios 新手,Apple 似乎反对通过参考一般文档来创建 nib 文件。你能给我一些关于 xibs 的链接或诸如“深入研究该文档,学习这些”之类的链接吗……无论如何,谢谢你的兴趣。 @Salihcyilmaz 检查我的编辑以获得更简单的方法。 1.你可以尝试使用UIScreen或者干脆尝试获取导航栏的宽度,看看数字是多少,根据不同的导航宽度分配不同的宽度。 @Salihcyilmaz 对于 3,我现在没有找到方便的东西。关于如何创建xib文件或如何重用xib文件有很多,我只是不知道现在是否真的有用:)如果您将来需要,只需搜索可重用的xib文件即可。跨度> 不错的一个。实际上你在编辑中所做的是我的故事板版本,我猜。无论如何,如果我将视图宽度设置为 160,那么在这两种情况下,一切似乎都还可以。否则他们开始远离中心。你能解释一下为什么会这样吗? @Salihcyilmaz 如果您已经在情节提要中设置了具有适当约束的视图,则无需在 viewdidload 中编写任何代码。

以上是关于导航栏标题视图对齐的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 设置状态栏背景颜色以与导航栏对齐

具有自定义视图的 UIBarButtonItem 在 iOS 7 上用作左侧或右侧导航栏项目时未正确对齐

如何将导航栏大标题转换为多行,居中对齐

如何以编程方式在导航栏正下方添加视图?

UIBarButtonItem在用作左侧或右侧导航栏项目时,自定义视图未在iOS 7上正确对齐

导航栏上的 CSS 对齐问题