当"prefersLargeTitles"设置为true时,更改导航栏标题的文本颜色

32

我有一个需求,需要使用带有红色大标题的UINavigationBar

目前,我有以下代码:

func prepareNavigationController() {
    let navController = UINavigationController(rootViewController: self)
    navController.navigationBar.prefersLargeTitles = true
    navigationItem.searchController = UISearchController(searchResultsController: nil)
    navigationItem.hidesSearchBarWhenScrolling = false
    navController.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor.rawValue: UIColor.red]
}

但实际上它并没有将标题标签变成红色。这是结果:

忽略的标题颜色

但是将prefersLargeTitles改为false就会做正确的事情,我的标题就变成了红色。

navController.navigationBar.prefersLargeTitles = false

着色的标题

我不确定这是否是一个错误,因为在撰写本文时,我们仍处于第一版测试阶段,或者这是否是有意行为,主要是因为我没有看到任何苹果的应用程序在大标题之前着色。是否有任何方法可以让大标题具有任何我想要的颜色?


我正在寻找完全相同的东西!但是我还没有找到如何更改它,也许因为这是第一个测试版,Apple还没有实现它。 - Philippe
也许这可能是正确的答案 https://dev59.com/S1cP5IYBdhLWcg3wH28Z#46007201 - Kevin Furman
6个回答

66

有一个新的UINavigationBar属性"largeTitleTextAttribute",应该对此有所帮助。

largeTitleTextAttribute

以下是一个示例代码,您可以将其添加到您的视图控制器的viewDidLoad方法中。

        navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.blue]

在此输入图片描述

这里是一个没有设置largeTitleTextAttributes的示例代码和屏幕截图,但barStyle已经设为黑色。

        navigationController?.navigationBar.barStyle = .black

输入图像描述

这是一张没有设置largeTitleTextAttributes的屏幕截图,但是barStyle被设置为.default。

        navigationController?.navigationBar.barStyle = .default

输入图像描述


有趣。这是Beta 3的新功能吗?我还没有下载,但现在我会去下载并查看它。 - Andy Ibanez
是的,我是第一次使用beta 3。或者至少我现在才注意到它。 - assb10yr
我会在几个小时内确认(因为网络太慢),因为该符号在Beta 2中不存在。 - Andy Ibanez
我可以确认Beta 3上有该符号。非常有趣的发现,我现在会测试它是否有效。如果有效,我将把你的答案标记为已接受(前提是你添加一些示例代码以帮助未来遇到这个问题的人)。 - Andy Ibanez

11
在iOS 13中,您现在需要使用 UINavigationBarAppearance 类来执行此操作...
let appearance = UINavigationBarAppearance(idiom: .phone)
appearance.largeTitleTextAttributes = [.foregroundColor: UIColor.systemRed]
appearance.titleTextAttributes = [.foregroundColor: UIColor.systemRed]
appearance.backgroundColor = .white
navigationItem.standardAppearance = appearance
navigationItem.scrollEdgeAppearance = appearance

将我的navigationItemstandardAppearance属性设置为无效。特别是,在我的视图控制器的viewWillAppear中执行此操作,并使用UINavigationBarAppearance设置largeTitleTextAttributes。您认为这可能是为什么? - josephap

7

不确定是否是beta 1和2中的错误,但以下是一种设置颜色的方法。这是一种有点“hacky”的解决方法,但在Apple修复此问题之前应该可以使用。在Objective-C和Swift版本中,此代码都放在viewDidAppear:方法中。

Objective-C:

dispatch_async(dispatch_get_main_queue(), ^{
    for (UIView *view in self.navigationController.navigationBar.subviews) {
        NSArray <__kindof UIView *> *subviews = view.subviews;
        if (subviews.count > 0) {
            UILabel *label = subviews[0];
            if (label.class == [UILabel class]) {
                [label setTextColor:[UIColor redColor]];
            }
        }
    }
});

Swift:

DispatchQueue.main.async {
     for view in self.navigationController?.navigationBar.subviews ?? [] {  
     let subviews = view.subviews  
     if subviews.count > 0, let label = subviews[0] as? UILabel {  
           label.textColor = UIColor.red
 } } }

这实际上是我在iOS 12上工作的唯一解决方案。 - ChavirA

2
如果使用故事板,只需在导航栏属性检查器中更改“大标题文本属性”标题颜色即可:

enter image description here


1
这是使用大标题并将小标题和大标题的文本颜色设置为白色的可行代码,适用于iOS11+和早期iOS版本。
// Will apply to versions before iOS 11
navigationController?.navigationBar.titleTextAttributes = [
    NSAttributedStringKey.foregroundColor: UIColor.white
]

if #available(iOS 11.0, *) {
    navigationController?.navigationBar.prefersLargeTitles = true
    navigationController?.navigationBar.largeTitleTextAttributes = [
        NSAttributedStringKey.foregroundColor: UIColor.white
    ]
}

曾经Xcode存在一个错误,但现在似乎已经修复了。


0
在 Xcode 14、Swift 5 和 iOS 15 上,您可以通过故事板属性检查器更改大标题的颜色。默认颜色为黑色。您需要选择导航栏,然后选择属性检查器。转到“滚动边缘栏按钮外观”部分,找到“首选大标题”复选框:

Prefers Large Titles

然后您需要将“大标题”设置为自定义,并将“标题颜色”设置为您想要的任何颜色(例如:白色),如红色箭头所示。

Changing Title Color


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接