2009-02-02 4 views
18

J'ai un UINavigationController et je l'ai changé en blanc en utilisant la propriété Tint de la barre de navigation dans Interface Builder. Mais le texte dans les boutons et le titre est toujours la couleur par défaut, blanc, et se perd ainsi sur le fond blanc. Quelqu'un sait comment contourner cela? Vous ne pouvez pas répéter le contenu de la vue UINavigationBar pour trouver les boutons dans awakeFromNib?Comment changer la couleur du texte sur les éléments du bouton UINavigationBar

Répondre

31

Comme d'iOS 5 ce beaucoup plus facile, en utilisant le proxy apparence UIBarButtonItem:

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: 
         [UIColor blackColor], 
         UITextAttributeTextColor, 
         [UIColor clearColor], 
         UITextAttributeTextShadowColor, nil]; 

[[UIBarButtonItem appearance] setTitleTextAttributes: attributes 
              forState: UIControlStateNormal]; 

Définissez ceci dans l'application: didFinishLaunchingWithOptions:

+1

Ceci pourrait également s'appliquer à UIBarButtonItem (s). Pour un bouton réel de la barre, vous pouvez écrire: [button setTitleTextAttributes: textAttributes forState: UIControlStateNormal]; –

1

+0

Vous pouvez. Mais je fais un setTextColor: forStates: sur mes boutons et il semble être ignoré. Va persévérer cependant. Aussi cela frôle l'utilisation privée api (ou au moins privée supposée de la structure de l'interface utilisateur). – schwa

+0

Oh, je prends ça en arrière - ça marche. Voir la réponse de suivi ... – schwa

+0

J'ai jeté un coup d'oeil à l'intérieur d'autres vues comme ceci. Bien que ce soit un API privé, il ne fait au moins aucune supposition: si le code interne change, votre code ne détectera pas la condition que vous recherchez. Mais je n'ai pas encore fait UINavigationBar. –

8

est ici une façon:

[[theNavigationBar.subviews objectAtIndex:1] setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; 
[[theNavigationBar.subviews objectAtIndex:2] setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; 

Cependant, énorme, mise en garde. Ceci est très susceptible de casser une future version de système d'exploitation et n'est pas recommandé. À tout le moins, vous devez effectuer beaucoup de tests et vous assurer que vos suppositions de la disposition de sous-vue de la barre de navigation sont correctes.

+1

Je trouverais cela particulièrement fragile, puisque vous accédez aux articles par index. Plus sûr serait d'obtenir tous les éléments de subview, comparer les classes contre ce que vous attendez, et même utiliser des positions. Mais c'est le noyau de l'idée juste là. :) –

+0

Droite. Je n'ai pas posté la manière réelle de le faire. Juste la première méthode qui a fonctionné. Programmation défensive ftw. – schwa

+0

comme c'est drôle que je ne reçoive pas de réponse pendant presque deux mois, et puis j'en ai toute une série ... de toute façon, j'ai marqué celle-ci parce que c'est la plus évolutive, même si j'ai fini par utiliser images de bouton. J'espère que quelque chose le rend dans l'API officielle par v3.0. – lawrence

2

Ou vous utilisez votre propre bouton barre sous-classe de l'élément avec un setter que vous spécifiez, n'est pas LUs iPhone OS 3 suppose d'exposer la couleur du texte pour chaque bouton

2

Je l'ai fait comme Drunknbass suggéré. J'ai eu recours à une série d'images pour le bouton de retour dans quelques états, et des boutons normaux dans quelques états, et les ai mis dans une sous-classe UIButton personnalisée, mettant en place les styles appropriés.

En tant que solution, elle ne s'adapte pas particulièrement bien, mais mes besoins étaient assez simples. Il a l'avantage de ne pas se casser si les commandes de subview dans les contrôles intégrés changent cependant, ce qui est l'inconvénient évident de cette approche. Inconvénient de besoin de plusieurs images. L'autre problème consiste à gérer un changement d'orientation, car les boutons doivent changer de taille. Sur une note connexe, si vous modifiez la couleur de la teinte de votre barre de navigation, elle ne fonctionne pas bien avec le contrôleur de vue «Plus» spécial pour personnaliser l'ordre d'une barre d'onglets. Il ne semble pas y avoir de moyen "acceptable" de changer la couleur de la barre d'outils dans cette vue.

+0

C'est une bonne solution pour une seule barre de navigation. Mais comme vous l'avez admis, ça ne va pas bien du tout. J'utiliserais probablement une solution comme celle-ci normalement. Mais je travaille sur une application qui a des exigences d'interface utilisateur très dynamiques. Je pourrais être forcé de faire quelque chose de plus hacky :-( – schwa

0

Ici, la manière propre (reposant sur l'API publique) pour ce faire à mon humble avis: vous devez utiliser la propriété titleView du navigationItem pour appliquer votre propre UILabel sur lequel vous personnaliserez le textColor

 
 
UILabel* lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 20)]; 
lbl.textAlignment=UITextAlignmentCenter; 
lbl.backgroundColor=[UIColor clearColor]; 
lbl.textColor=[UIColor colorWithRed:0.18 green:0.2 blue:0.56 alpha:1]; 
theControllerOnWhichYouWantToHaveATitleWithYourOwnColor.navigationItem.titleView=lbl; 
[lbl release]; 
 

+0

Cela n'affecte pas la couleur des boutons gauche et droit de l'élément de navigation – lawrence

+0

-1! :) Ok cela ne résout pas le bouton de retour par exemple, mais il résout le problème problème pour la vue du titre principal. La même approche peut être appliquée au bouton de retour sur lequel vous pouvez également définir une vue personnalisée. Ensuite, je suis d'accord que vous devez construire la vue correcte avec l'image d'arrière-plan correcte et ainsi de suite, mais c'est "faisable", et avec l'API publique. – yonel

+0

Bien sûr, vous obtiendrez downvoted si vous répondez à une question différente. Votre réponse serait correcte pour cette question: http://stackoverflow.com/questions/599405/iphone-navigation-bar-title-text-color –

11
for (id subView in theNavigationBar.subviews) { 
    if ([subView isKindOfClass:[UIButton class]]) { 
     [(UIButton *)subView setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 
     [(UIButton *)subView setTitleShadowColor:[UIColor clearColor] forState:UIControlStateNormal]; 
    } 

} 
-1

Vous pouvez modifier l'apparence du titre en ajoutant un libellé dans la barre de navigation comme ci-dessous.

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 35)]; 
label.backgroundColor = [UIColor clearColor]; 
label.textAlignment = UITextAlignmentCenter; 
label.textColor =[UIColor whiteColor]; 
label.text=self.title; 
self.navigationItem.titleView = viewLabel; 
[label release]; 
Questions connexes