ios 当“prefersLargeTitles”设置为true时更改导航栏标题的文本颜色

qmb5sa22  于 2023-03-31  发布在  iOS
关注(0)|答案(6)|浏览(177)

我有一个要求,我必须使用带有红色大标题的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

我不完全确定这是一个bug,因为在写这篇文章的时候,我们仍然在第一个测试版中,或者如果这是故意的行为,主要是因为我还没有任何苹果的应用程序之前的颜色大标题。有没有什么方法可以让大标题有任何颜色我想要的?

balp4ylt

balp4ylt1#

有一个新的UINavigationBar属性“largeTitleTextAttribute”可以帮助解决这个问题。
largeTitleTextAttribute
下面是一个可以添加到视图控制器viewDidLoad方法中的示例代码

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

下面是一个没有设置largeTitleTextAttributes的示例代码和屏幕截图,但是barStyle设置为.black

navigationController?.navigationBar.barStyle = .black

下面是一个没有设置largeTitleTextAttributes的屏幕截图,但是barStyle设置为.default

navigationController?.navigationBar.barStyle = .default

nwlls2ji

nwlls2ji2#

在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
41zrol4v

41zrol4v3#

不确定这是否是beta 1和2中的一个bug,但这里有一种设置颜色的方法。这是一个有点“黑客”的解决方案,但在Apple修复这个问题之前应该可以工作。在Objective-C和Swift版本中,这段代码都在viewDidAppear:方法中。
目标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]];
            }
        }
    }
});

斯威夫特:

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
 } } }
zxlwwiss

zxlwwiss4#

如果使用情节提要,只需在导航栏属性检查器中更改“大标题文本属性”标题颜色:

8e2ybdfx

8e2ybdfx5#

下面是使用大标题并将大小标题的文本颜色设置为白色的工作代码,无论是在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中曾经有一个bug,但现在似乎已经修复了)*
p3rjfoxz

p3rjfoxz6#

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

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

相关问题