web-dev-qa-db-ger.com

Ändern der Textfarbe eines Navigationsleistentitels, wenn "prefersLargeTitles" auf "true" gesetzt ist

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:

 Ignored title color

Aber prefersLargeTitles in false zu ändern ist das Richtige, und mein Titel ist rot.

navController.navigationBar.prefersLargeTitles = false

 Tinted Title

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?

19
Andy Ibanez

Es gibt eine neue UINavigationBar-Eigenschaft "largeTitleTextAttribute", die dazu beitragen sollte.

largeTitleTextAttribute

Hier ist ein Beispielcode, den Sie der viewDidLoad-Methode Ihrer View-Controller hinzufügen können

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

 enter image description here

Hier ist ein Beispielcode und ein Screenshot ohne den Satz largeTitleTextAttributes, der BarStyle ist jedoch auf .black gesetzt

        navigationController?.navigationBar.barStyle = .black

 enter image description here

Hier ist ein Screenshot ohne die Einstellung largeTitleTextAttributes, der BarStyle ist jedoch auf .default gesetzt

        navigationController?.navigationBar.barStyle = .default

 enter image description here

39
assb10yr

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

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
2
Ashley Mills

Wenn Sie das Storyboard verwenden, ändern Sie einfach die Titelfarbe für "Große Titeltextattribute" im Attributinspektor für die Navigationsleiste: 

 enter image description here

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)

0
Kqtr