web-dev-qa-db-fra.com

Modification de la couleur du texte d'un titre de barre de navigation lorsque "prefersLargeTitles" est défini sur true

J'ai une exigence dans laquelle je dois utiliser une UINavigationBar avec un gros titre rouge.

Actuellement, j'ai le code suivant:

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

Mais ce n'est pas réellement colorer le titre en rouge. Voici le résultat:

 Ignored title color

Mais changer prefersLargeTitles en faux fait la bonne chose et mon titre est rouge.

navController.navigationBar.prefersLargeTitles = false

 Tinted Title

Je ne suis pas tout à fait sûr qu'il s'agisse d'un bogue, car au moment d'écrire ces lignes, nous en étions encore à la première version bêta, ou s'il s'agissait d'un comportement intentionnel, principalement parce que aucune de mes applications Apple ne colorait les gros titres auparavant. Existe-t-il un moyen d'obtenir que le grand titre ait la couleur que je veux?

19
Andy Ibanez

Il existe une nouvelle propriété UINavigationBar "largeTitleTextAttribute" qui devrait aider à cela.

largeTitreTexteAttribute

Voici un exemple de code que vous pouvez ajouter à votre méthode de contrôleur de vue viewDidLoad

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

 enter image description here

Voici un exemple de code et une capture d'écran sans l'ensemble largeTitleTextAttributes mais barStyle est défini sur.

        navigationController?.navigationBar.barStyle = .black

 enter image description here

Voici une capture d'écran sans l'ensemble largeTitleTextAttributes, mais barStyle est défini sur .default

        navigationController?.navigationBar.barStyle = .default

 enter image description here

39
assb10yr

Je ne sais pas s'il s'agit d'un bogue dans les bêta 1 et 2, mais voici un moyen de définir la couleur C'est un peu une solution de contournement, mais cela devrait fonctionner jusqu'à ce que Apple corrige cela. Dans les versions Objective-C et Swift, ce code est utilisé dans la méthode viewDidAppear:.

Objectif 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]];
            }
        }
    }
});

Rapide:

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

Si vous utilisez le storyboard, il suffit de modifier "Attributs de texte de titre large" Couleur du titre dans l'inspecteur d'attributs de la barre de navigation 

 enter image description here

0

Voici le code de travail permettant d’utiliser des titres de grande taille et de définir la couleur du texte des titres de petite taille et de grande taille sur blanc, aussi bien sur iOS11 + que sur les versions iOS antérieures.

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

(Il y avait un bogue dans Xcode, mais il semble maintenant être corrigé)

0
Kqtr