如何在 Xcode 中左对齐导航栏的标题?

Posted

技术标签:

【中文标题】如何在 Xcode 中左对齐导航栏的标题?【英文标题】:How do I left align the title of a navigation bar in Xcode? 【发布时间】:2017-06-12 18:21:43 【问题描述】:

为了让导航栏的标题左对齐,我一直在尝试以下方法:

AppDelegate.swift 文件中:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
    // Override point for customization after application launch.


    UINavigationBar.appearance().barTintColor = UIColor.red
    UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName:
        UIColor.white]
    return true

TableViewController.swift 文件中:

override func viewDidAppear(_ animated: Bool) 
        super.viewDidAppear(animated)
        self.navigationController?.navigationBar.topItem?.title = "Home"
    

但我没有找到解决问题的方法。我还尝试了我在此处找到的以下内容,但没有显示任何内容:

AppDelegate.swift 文件中:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
    // Override point for customization after application launch.


    UINavigationBar.appearance().barTintColor = UIColor.red
    UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName:
        UIColor.white]
let lbNavTitle = UILabel (frame: CGRect(x: 0, y: 40, width: 320, height: 40))
    lbNavTitle.center = CGPoint(x: 160, y: 285)
    lbNavTitle.textAlignment = .left
    lbNavTitle.text = "Home"
    self.navigationItem.titleView = lbNavTitle

TableViewController.swift 文件中:

override func viewDidAppear(_ animated: Bool) 
    super.viewDidAppear(animated)
    self.navigationController?.navigationBar.topItem?.title = "Home"
    let lbNavTitle = UILabel (frame: CGRect(x: 0, y: 0, width: 320, height: 40))
    lbNavTitle.backgroundColor = UIColor.red
    lbNavTitle.textColor = UIColor.black
    lbNavTitle.numberOfLines = 0
    lbNavTitle.center = CGPoint(x: 0, y: 0)
    lbNavTitle.textAlignment = .left
    lbNavTitle.text = "Home"

    let string = NSMutableAttributedString ("Title/nSubTitle")

    self.navigationItem.titleView = lbNavTitle

【问题讨论】:

@DashAndRest 感谢您的建议。你能解释一下为什么你建议对文件名进行格式化,我以后该怎么做? 为了吸引读者的注意力,标记重要的地方总是好的 【参考方案1】:
let label = UILabel()
label.textColor = UIColor.white
label.text = "TCO_choose_reminder".localized;
self.navigationItem.leftBarButtonItem = UIBarButtonItem.init(customView: label)

我使用获取 UIView 的构造函数初始化 UIBarButtonItem 并将我想要的标签设置为参数以获取以下内容。

编辑:

如果您不想移除后退按钮。设置以下标志。

self.navigationItem.leftItemsSupplementBackButton = true

请记住,带有标签 + 后退按钮(带有标题)看起来并不酷。在这种情况下,我将默认的后退按钮替换为箭头资源。

【讨论】:

这会导致后退按钮消失 @BrunoMuniz 你有什么期望?你想把标题左对齐并在它旁边有一个后退按钮吗? 我的情况和@BrunoMuniz 说的一样,这个问题有答案吗? @Ilker Baltaci。是的,标题左对齐,标题旁边的后退按钮。就像材料设计一样。【参考方案2】:

您可以使用 navigationItems titleView 添加左对齐的 UILabel,然后使用自动布局设置其框架,如下所示:

let label = UILabel()
label.text = "Title Label"
label.textAlignment = .left
self.navigationItem.titleView = label
label.translatesAutoresizingMaskIntoConstraints = false
label.superview?.addConstraint(NSLayoutConstraint(item: label, attribute: .centerX, relatedBy: .equal, toItem: label.superview, attribute: .centerX, multiplier: 1, constant: 0))
label.superview?.addConstraint(NSLayoutConstraint(item: label, attribute: .width, relatedBy: .equal, toItem: label.superview, attribute: .width, multiplier: 1, constant: 0))
label.superview?.addConstraint(NSLayoutConstraint(item: label, attribute: .centerY, relatedBy: .equal, toItem: label.superview, attribute: .centerY, multiplier: 1, constant: 0))
label.superview?.addConstraint(NSLayoutConstraint(item: label, attribute: .height, relatedBy: .equal, toItem: label.superview, attribute: .height, multiplier: 1, constant: 0))

【讨论】:

谢谢。这行得通。需要添加以下行:self.navigationController?.navigationItem.title = label.text 以确保获得所需的结果。 如果我执行此应用程序会因为说“无法修改控制器管理的 UINavigationBar 的约束而崩溃。我试过 ViewDidLoad、ViewWillAppear 和 viewDidLayoutSubviews @Neha 这可能是很多事情。我建议您问自己的问题,然后您可以添加代码的详细信息等。 @Neha 我也遇到了这个错误。我懒得去查原因。所以这是我的解决方案。我没有添加约束,而是添加了这个以使标签的框架等于超级视图的大小: if let titleView = label.superview label.frame = titleView.frame 这对我不起作用,***.com/a/42430844/2764966 对我有用。【参考方案3】:

好吧,如果你想使用大标题,那么它是默认左对齐的。

对于整个导航层次结构。

navigationController?.navigationBar.prefersLargeTitles = true

对于 1 个视图控制器

navigationItem.largeTitleDisplayMode = .always

【讨论】:

【参考方案4】:

如果您想要一个覆盖整个 titleView 区域的简单左对齐文本,这就是我的解决方案!

func setLeftAlignTitleView(font: UIFont, text: String, textColor: UIColor) 
    guard let navFrame = navigationController?.navigationBar.frame else
        return
    
    
    let parentView = UIView(frame: CGRect(x: 0, y: 0, width: navFrame.width*3, height: navFrame.height))
    self.navigationItem.titleView = parentView
    
    let label = UILabel(frame: .init(x: parentView.frame.minX, y: parentView.frame.minY, width: parentView.frame.width, height: parentView.frame.height))
    label.backgroundColor = .clear
    label.numberOfLines = 2
    label.font = font
    label.textAlignment = .left
    label.textColor = textColor
    label.text = text
    
    parentView.addSubview(label)

【讨论】:

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

仅在折叠位置时如何设置 Bootstrap 5 导航栏的样式?

如何使用swift3增加导航栏的高度并更改xcode 8中状态栏的颜色?

如何在Android中左对齐TabLayout的标签文本

如何在 UITableViewCell 中左对齐或右对齐 UILabel

如何在ggplot2的注释中左对齐文本

如何在Android的tableview中左对齐文本