Ich habe eine Anforderung, bei der ich eine UINavigationBar
mit einem roten großen Titel verwenden muss.
Derzeit habe ich folgenden Code:
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]
}
Es ist jedoch nicht wirklich, das Titeletikett rot zu färben. Das ist das Ergebnis:
Aber prefersLargeTitles
in false zu ändern ist das Richtige, und mein Titel ist rot.
navController.navigationBar.prefersLargeTitles = false
Ich bin nicht ganz sicher, ob es sich hierbei um einen Fehler handelt, da wir uns zum Zeitpunkt der Veröffentlichung noch in der ersten Beta befinden, oder ob es sich um beabsichtigtes Verhalten handelt, meistens weil ich keine Apples-Apps vor den großen Titeln verwendet habe. Gibt es eine Möglichkeit, den großen Titel so zu gestalten, dass er eine beliebige Farbe hat?
Es gibt eine neue UINavigationBar-Eigenschaft "largeTitleTextAttribute", die dazu beitragen sollte.
Hier ist ein Beispielcode, den Sie der viewDidLoad-Methode Ihrer View-Controller hinzufügen können
navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.blue]
Hier ist ein Beispielcode und ein Screenshot ohne den Satz largeTitleTextAttributes, der BarStyle ist jedoch auf .black gesetzt
navigationController?.navigationBar.barStyle = .black
Hier ist ein Screenshot ohne die Einstellung largeTitleTextAttributes, der BarStyle ist jedoch auf .default gesetzt
navigationController?.navigationBar.barStyle = .default
Nicht sicher, ob es sich um einen Fehler in der Beta 1 & 2 handelt, aber hier können Sie die Farbe einstellen. Es ist ein bisschen "hacky" Workaround, aber es sollte funktionieren, bis Apple das behoben hat. In der Objective-C- und der Swift-Version wird dieser Code in die viewDidAppear:
-Methode übernommen.
Ziel 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]];
}
}
}
});
Schnell:
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
} } }
Die Art und Weise, wie Sie dies in iOS 13 tun, hat sich geändert. Sie verwenden jetzt die UINavigationBarAppearance
-Klasse wie diese…
let appearance = UINavigationBarAppearance(idiom: .phone)
appearance.largeTitleTextAttributes = [.foregroundColor: UIColor.systemRed]
appearance.titleTextAttributes = [.foregroundColor: UIColor.systemRed]
appearance.backgroundColor = .white
navigationItem.standardAppearance = appearance
navigationItem.scrollEdgeAppearance = appearance
Hier ist der Arbeitscode für die Verwendung großer Titel und setzt die Textfarbe für kleine und große Titel auf Weiß, sowohl auf iOS11 + als auch auf älteren iOS-Versionen.
// 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
]
}
(Früher gab es einen Fehler in Xcode, aber er scheint jetzt behoben zu sein)