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

我有一个要求,我必须使用带有红色大标题的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的应用程序为大型游戏着色。 有没有办法真正让大标题拥有我想要的任何颜色?

有一个新的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 

在此处输入图像描述

不确定它是否是测试版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]]; } } } }); 

迅速:

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

这是使用大型标题的工作代码,并将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中的错误,但它现在似乎已修复)