2008-11-28 7 views
13

J'utilise une teinte personnalisée sur la barre de navigation de mon UINavigationController, et comme la couleur est si claire, je dois utiliser du texte de couleur foncée. Il est relativement facile d'échanger la vue du titre et les boutons personnalisés que j'ai ajoutés sur le côté droit, mais je n'arrive pas à obtenir une vue personnalisée à coller sur le bouton de retour. Voilà ce que je suis en train en ce moment:Comment puis-je personnaliser la couleur du texte du bouton de retour dans une vue d'en-tête UINavigationController?

UILabel *backLabel = [[UILabel alloc] initWithFrame:CGRectZero]; 

    [backLabel setFont:[UIFont fontWithName:[[UIFont fontNamesForFamilyName:@"Arial Rounded MT Bold"] objectAtIndex:0] size:24.0]]; 
    [backLabel setTextColor:[UIColor blackColor]]; 
    [backLabel setShadowColor:[UIColor clearColor]]; 

    [backLabel setText:[aCategory displayName]]; 
    [backLabel sizeToFit]; 
    [backLabel setBackgroundColor:[UIColor clearColor]]; 

    UIBarButtonItem *temporaryBarButtonItem=[[UIBarButtonItem alloc] initWithCustomView:backLabel]; 

    temporaryBarButtonItem.customView = backLabel; 
    [backLabel release]; 

    self.navigationItem.backBarButtonItem = temporaryBarButtonItem; 
    [temporaryBarButtonItem release];] 

La vue personnalisée ne colle pas bien, et je ne vois aucun moyen évidemment facile d'obtenir le texte réel à l'intérieur du bouton par défaut et commencer à changer son style.

+2

Par curiosité: Pourquoi cette question wiki communautaire ? –

+1

Par curiosité: Pourquoi chaque wiki de communauté répond-il à une seule réponse? –

Répondre

6

Il n'existe aucun moyen officiel de le faire. Les deux méthodes que je pourrais penser sont:

  • naviguer dans l'arborescence de la vue pour trouver le bouton Précédent existant, et définir sa couleur de texte manuellement. Ce n'est probablement pas une bonne idée, car elle est fragile, et le bouton peut même ne pas avoir une propriété textColor configurable.

  • créer votre propre bouton de retour (c'est-à-dire, avec votre propre image), et définir sa couleur. C'est ce que nous faisons dans un certain nombre d'endroits. C'est un peu plus de travail, mais les résultats sont exactement ce que vous voulez.

4

J'ai essayé traverser pour définir le texte, mais il finit ups sur un UINavigationItemButtonView, qui semble juste dessiner directement. Il n'y a aucun moyen de définir la couleur.

La seule façon de le faire fonctionner est de convertir le texte en image, puis de régler le bouton de retour sur l'image.

UIBarButtonItem * backItem = [[UIBarButtonItem alloc] initWithImage:backImage style:UIBarButtonItemStylePlain target:nil action:nil]; 
navItem.backBarButtonItem = backItem; 
[backItem release]; 
1

SkotchV est correct. Dans les versions précédentes du SDK, ils utilisaient des instances UIButton distinctes, ce qui permettait la personnalisation en traversant la hiérarchie de sous-vues. Ce n'est plus possible.

0

@DrMickeyLauer L'itération de la hiérarchie pour définir la couleur du texte est possible dans mon environnement de développement.
Lorsque vous remplissez vos vues UINavigationBar's gauche et droite, votre UINavigationBar aura UIButtons comme sous-vues. Si vous souhaitez ajouter des règles fantaisistes et parentales à votre barre de navigation, vous pouvez parcourir vos points de navBar en recherchant UINavigationItems (via isKindOfClass:). Ces éléments de navigation ont des tableaux d'éléments de gauche et de droite. Ces tableaux contiennent (entre autres) la ou les barres d'outils que vous avez placées dans les vues gauche et droite de la barre de navigation. Ces tableaux de gauche et de droite vous permettent d'accéder à la barre d'outils UIBarButtonItems. Vous pouvez ensuite appeler setTitleTextAttributes sur le UIBarButtonItems pour définir leurs couleurs de texte et d'ombre. Mais, comme l'a déclaré Ben Gottlieb, il s'agit d'une approche fragile. Cela vous laisse vous demander si l'organisation de la barre de navigation va changer à l'avenir.

+0

Vous ne devez pas définir 'leftBarButtonItem' pour les boutons de retour - cela interrompt l'animation de transition ajustée à laquelle les utilisateurs iOS sont habitués: http: // watchapple.com/2009/11/a-plus-regard-sur-iphone-transition-animations/ –

+0

@Yang A) Qu'est-ce que cela a à voir avec ma réponse? B) L'article que vous avez référencé déclare que les utilisateurs ne remarquent pas l'animation. – stephen

+0

A) Pour une raison quelconque, j'ai pensé à tort que vous proposiez de créer un élément de bouton de barre personnalisé pour le bouton de retour et de l'ajouter comme élément de gauche. Mea culpa. B) Je fais certainement - YMMV. Pour moi, c'est une de ces petites choses ... –

38

Cela fonctionne, permet de résoudre la question initiale (changer le bouton Navbar RETOUR - et pas de boutons sur d'autres barres d'outils, pas de boutons sur les barres d'onglets, etc.):

[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor blackColor], UITextAttributeTextColor,nil] 
     forState:UIControlStateNormal]; 
+0

Cela fonctionne à partir de iOS 5 (la question originale date de 2008). Pour être précis, cela définit également les attributs de texte pour d'autres UIBarButtonItems, par ex. Boutons Terminé/Annuler, dans les barres de navigation. –

+0

cela fonctionne très bien sur Xcode 5: D –

+1

UITextAttributeTextColor a été détruit dans ios7, plutôt utiliser NSForegroundColorAttributeName dans ce cas – Chris

Questions connexes