Colore freccia freccia pulsante Indietro UIBar iOS 7


172

Sto cercando di cambiare la freccia del pulsante Indietro

inserisci qui la descrizione dell'immagine

Attualmente sto usando quanto segue per controllare le dimensioni del testo e il colore del testo sul pulsante Indietro:

[[UIBarButtonItem appearance] setTitleTextAttributes:
  [NSDictionary dictionaryWithObjectsAndKeys:
    [UIColor whiteColor], UITextAttributeTextColor,
    [UIFont boldSystemFontOfSize:16.0f], UITextAttributeFont,
    [UIColor darkGrayColor], UITextAttributeTextShadowColor,
    [NSValue valueWithCGSize:CGSizeMake(0.0, -1.0)], UITextAttributeTextShadowOffset,
  nil] forState:UIControlStateNormal];

ma se voglio cambiare solo il colore della freccia per il pulsante Indietro, cosa devo fare?


Hai trovato una soluzione per cambiare il colore della freccia per il pulsante Indietro?
OnkarK,

1
@OMK Ho finito per cambiare la mia proprietà Infolist NavBarColor per farlo funzionare e quindi impostare il colore della barra di navigazione su un colore diverso. Non sono sicuro di cosa stesse succedendo, ma quella soluzione ha funzionato per me
Kevin il

1
Il comportamento di alcune delle proprietà di UINavigationBarè cambiato da iOS 7. Dai un'occhiata alla risposta per vedere anche l'effetto di alcune altre proprietà .
Bhavin,

Si prega di aiutare con questo problema: stackoverflow.com/questions/29923813/...
MILOS Kresović

Risposte:


438

Per cambiare il colore chevron del pulsante Indietro per un controller di navigazione specifico *:

self.navigationController.navigationBar.tintColor = [UIColor whiteColor];

* Se si utilizza un'app con più di 1 controller di navigazione e si desidera applicare questo colore chevron a ciascuno, è possibile utilizzare il proxy dell'aspetto per impostare il chevron del pulsante Indietro per ogni controller di navigazione, come segue:

[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];

E per buona misura, in fretta (grazie a Jay Mayu nei commenti):

UINavigationBar.appearance().tintColor = UIColor.whiteColor()

3
Ciò si applica all'intera app solo se si utilizza lo stesso controller di navigazione per l'intera app. In realtà raccomando il suggerimento di Bart.
Kyle Clegg,

1
Ho aggiornato la mia risposta con una nota su più controller di navigazione. Non sono ancora d'accordo sul fatto che il suggerimento di Bart sia la risposta "corretta", perché ci sono molti altri effetti collaterali quando si imposta il colore della tinta dell'intera app. Inoltre, la domanda originale non chiedeva come creare il tema dell'intera app, ma solo come tema del pulsante Indietro.
DiscDev

1
Questo non sembra impostare il colore del gallone posteriore.
jcampbell1,

2
@ jcampbell1 - Lo sto usando con successo in molte delle mie app ... forse non hai letto l'avvertenza su più UINavigationController.
DiscDev,

7
per rapidoUINavigationBar.appearance().tintColor = UIColor.whiteColor()
Jay Mayu il

57

Devi impostare il tintColor dell'intera app.

self.window.tintColor = [UIColor redColor];

O in Swift 3:

self.window?.tintColor = UIColor.blue

Fonte: Guida alla transizione dell'interfaccia utente di iOS 7


4
Se vuoi solo impostare il colore del pulsante posteriore chevron (e non l'intera app), come indicato nella domanda originale, questa è la risposta sbagliata. Vedere la mia risposta qui per la risposta corretta: stackoverflow.com/a/18809412/1103584
DiscDev

L'ho usato nel mio delegato dell'app per cambiare i miei pulsanti posteriori in nero. Inserisci nel metodo applicationDidFinishLaunchingWithOptions ... window.tintColor = [UIColor blackColor];
Marc Watson,

Questo non può funzionare su iOS 6. Qualcuno sa cosa fare?
Gavjr,

1
Ciò ha influito sul tintColor dell'intera app, che include qualsiasi UIActivityViewController (per la condivisione) e MFMailComposeViewController (per l'invio di e-mail). Quelle finestre di dialogo presumono che tintColor non sia stato modificato con .... e possa provocare brutte interazioni cromatiche.
Mike Lambert,

Questo cambia il colore della tinta di molti altri oggetti, come ad esempio il cursore lampeggiante UITextField. Sicuramente sconsigliato.
Hunter Monk

55

Puoi impostare il colore sull'intera barra di navigazione dell'app usando il metodo

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
(NSDictionary *)launchOptions{
    [[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
}

23

In questo modo è possibile cambiare solo il colore della freccia (non il colore del titolo del pulsante Indietro):

[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor blackColor]];

La barra di navigazione contiene una sottoview del tipo _UINavigationBarBackIndicatorView (ultimo elemento nella matrice delle sottoview) che rappresenta la freccia.

Il risultato è una barra di navigazione con diversi colori della freccia del pulsante Indietro e del titolo del pulsante Indietro


4
A seconda dell'ordine delle sottoview delle viste di sistema è una cattiva idea.
Glenn Maynard,

2
questo ha funzionato, quando l'impostazione self.navigationController.navigationBar.tintColor non ha funzionato.
Rich Fox,

@GlennMaynard Hai ragione: il modo migliore per implementare questo sarebbe quello di scorrere attraverso la serie di sottoview restituite self.navigationController.navigationBar.subviewsfino a quando non viene trovato il pulsante Indietro.
Evan R

@EvanR mentre la soluzione di selmad ha funzionato per me, iterando attraverso la serie di sottoview non ha funzionato (cosa che ho provato prima perché sono d'accordo con te sul fatto che sarebbe saggio farlo). Se funziona per te, aggiungi un esempio. Grazie.
jungledev,

22

Se si utilizzano gli storyboard, è possibile impostare il colore della tinta della barra di navigazione.

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine


Esattamente quello che stavo cercando. Grazie!
Chad Lewis,

11

All'interno del rootViewController che inizializza il navigationController, ho inserito questo codice nel mio metodo viewDidAppear:

//set back button color
[[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor whiteColor], UITextAttributeTextColor,nil] forState:UIControlStateNormal];
//set back button arrow color
[self.navigationController.navigationBar setTintColor:[UIColor whiteColor]];

2
UITextAttributeTextColor è obsoleto in iOS 7 - usa NSForegroundColorAttributeName
amergin

7

In iOS 6, tintColor ha colorato lo sfondo di barre di navigazione, barre delle schede, barre degli strumenti, barre di ricerca e barre dell'ambito. Per tingere lo sfondo di una barra in iOS 7, usa invece la proprietà barTintColor.

Risorse di progettazione di iOS 7 Guida alla transizione dell'interfaccia utente di iOS 7


2
Questo è quello! ... inseriscilo nel delegato dell'app. Funziona come un fascino! window.tintColor = [UIColor blackColor]; // Volevo nero
Marc Watson,

6

È possibile impostare la tintColorproprietà sul pulsante (o sulla voce pulsante barra) o sulla vista del controller di visualizzazione. Per impostazione predefinita, la proprietà erediterà la tinta dalla vista principale, fino al livello superiore UIWindowdella tua app.


1
Grazie per la risposta. Tuttavia, funziona in modo leggermente diverso su iOS 7. Il mio vecchio codice utilizzava tintColor, ma a iOS 7 non sembra piacere molto. Ho finito per usare la guida ufficiale alla transizione di Apple Dev iOS 7 per risolvere alcuni problemi dell'interfaccia utente
kevinl,

Vedere la mia risposta per un esempio di discreta di come fare questo: stackoverflow.com/a/18809412/1103584
DiscDev

5

Ho dovuto usare entrambi:

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

[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor whiteColor]];

E funziona per me, grazie per tutti!


5
UINavigationBar *nbar = self.navigationController.navigationBar;

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
   //iOS 7
   nbar.barTintColor = [UIColor blueColor]; // bar color
   //or custom color 
   //[UIColor colorWithRed:19.0/255.0 green:86.0/255.0 blue:138.0/255.0 alpha:1];

   nbar.navigationBar.translucent = NO;

   nbar.tintColor = [UIColor blueColor]; //bar button item color

} else {
   //ios 4,5,6
   nbar.tintColor = [UIColor whiteColor];
   //or custom color
   //[UIColor colorWithRed:19.0/255.0 green:86.0/255.0 blue:138.0/255.0 alpha:1];

}

Grande. Mi ha aiutato Grazie
Yogesh Lolusare il

4

Aggiorna Swift 3

navigationController?.navigationItem.rightBarButtonItem?.tintColor = UIColor.yellow
navigationController?.navigationBar.tintColor = UIColor.red
navigationController?.navigationBar.barTintColor = UIColor.gray
navigationController?.navigationBar.titleTextAttributes =  [NSForegroundColorAttributeName: UIColor.blue]

Risultato: inserisci qui la descrizione dell'immagine


3

Solo per cambiare il NavigationBarcolore è possibile impostare il colore della tinta come di seguito.

[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];

Ciò non influirà sul colore della tinta in iOS 7. Secondo i documenti: "L'impostazione della proprietà tintColor utilizzando le API proxy dell'aspetto non è supportata in iOS 7." link
bachonk

3

Nel caso in cui si stia creando un pulsante Indietro personalizzato basato su UIButton con l'immagine della freccia, ecco lo snippet della sottoclasse. Usandolo puoi creare un pulsante nel codice o semplicemente assegnare una classe in Interface Builder a qualsiasi UIButton. Freccia indietro L'immagine verrà aggiunta automaticamente e colorata con il colore del testo.

@interface UIImage (TintColor)

- (UIImage *)imageWithOverlayColor:(UIColor *)color;

@end


@implementation UIImage (TintColor)

- (UIImage *)imageWithOverlayColor:(UIColor *)color
{
    CGRect rect = CGRectMake(0.0f, 0.0f, self.size.width, self.size.height);

    if (UIGraphicsBeginImageContextWithOptions) {
        CGFloat imageScale = 1.0f;
        if ([self respondsToSelector:@selector(scale)])
            imageScale = self.scale;
        UIGraphicsBeginImageContextWithOptions(self.size, NO, imageScale);
    }
    else {
        UIGraphicsBeginImageContext(self.size);
    }

    [self drawInRect:rect];

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetBlendMode(context, kCGBlendModeSourceIn);

    CGContextSetFillColorWithColor(context, color.CGColor);
    CGContextFillRect(context, rect);

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

@end




#import "iOS7backButton.h"

@implementation iOS7BackButton

-(void)awakeFromNib
{
    [super awakeFromNib];

    BOOL is6=([[[UIDevice currentDevice] systemVersion] floatValue] <7);
    UIImage *backBtnImage = [[UIImage imageNamed:@"backArrow"] imageWithOverlayColor:self.titleLabel.textColor];
    [self setImage:backBtnImage forState:UIControlStateNormal];
    [self setTitleEdgeInsets:UIEdgeInsetsMake(0, 5, 0, 0)];
    [self setImageEdgeInsets:UIEdgeInsetsMake(0, is6?0:-10, 0, 0)];


}


+ (UIButton*) buttonWithTitle:(NSString*)btnTitle andTintColor:(UIColor*)color {
    BOOL is6=([[[UIDevice currentDevice] systemVersion] floatValue] <7);
    UIButton *backBtn=[[UIButton alloc] initWithFrame:CGRectMake(0, 0, 60, 30)];
    UIImage *backBtnImage = [[UIImage imageNamed:@"backArrow"] imageWithOverlayColor:color];
    [backBtn setImage:backBtnImage forState:UIControlStateNormal];
    [backBtn setTitleEdgeInsets:UIEdgeInsetsMake(0, is6?5:-5, 0, 0)];
    [backBtn setImageEdgeInsets:UIEdgeInsetsMake(0, is6?0:-10, 0, 0)];
    [backBtn setTitle:btnTitle forState:UIControlStateNormal];
    [backBtn setTitleColor:color /*#007aff*/ forState:UIControlStateNormal];

    return backBtn;
}

@end

immagine pulsante indietro @ 2x


3

Se si desidera modificare solo la freccia indietro MA sull'intera app, procedere come segue:

[[NSClassFromString(@"_UINavigationBarBackIndicatorView") appearance] 
  setTintColor:[UIColor colorWithHexString: @"#f00000"]];

C'è una possibilità che ciò ti farebbe rifiutare dall'app store
Luca

@ Luca, l'ho usato con successo diverse volte. Nessun rifiuto. Ma sì, esiste ancora la possibilità.
orkenstein,

È ancora probabile che si rompa nella futura versione di iOS
Lope

1
@Lope, sì, perché no. Non sto cercando proiettili d'argento.
orkenstein,

Scorrere le visualizzazioni secondarie su iOS 10.1 mostra che quello è ancora il nome della classe, ma impostare il suo aspetto come mostrato qui non ha alcun effetto per me.
arlomedia,

2

In iOS 7, puoi inserire la seguente riga di codice application:didFinishLaunchingWithOptions:nel tuo AppDelegate.mfile:

[[UINavigationBar appearance] setTintColor:myColor];

Impostare myColorsul colore che si desidera che il pulsante Indietro sia nell'intera app. Non c'è bisogno di metterlo in ogni file.


0

Swift 2.0: barra di navigazione e pulsanti per colorare

navigationController?.navigationBar.barTintColor = UIColor.blueColor()
navigationController?.navigationBar.tintColor = UIColor.whiteColor()
navigationController!.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]

0

In rapido 3, per cambiare il colore della freccia del pulsante Indietro UIBarButton

self.navigationController?.navigationBar.tintColor = UIColor.black
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.