Kolor strzałki przycisku Wstecz w iOS 7 UIBarButton

172

Próbuję zmienić strzałkę przycisku Wstecz

wprowadź opis obrazu tutaj

Obecnie używam następujących elementów do kontrolowania rozmiaru tekstu, a także koloru tekstu na przycisku Wstecz:

[[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];

ale jeśli chcę zmienić tylko kolor strzałki przycisku Wstecz, co mam zrobić?

kevinl
źródło
Czy znalazłeś rozwiązanie, aby zmienić kolor strzałki przycisku Wstecz?
OnkarK
1
@OMK Skończyło się na zmianie mojej infolistproperty NavBarColor, aby działała, a następnie ustawiłem rzeczywisty navbarcolor na inny kolor. Nie jestem pewien, co się dzieje, ale to rozwiązanie zadziałało dla mnie
kevinl
1
Zachowanie niektórych właściwości UINavigationBarzmieniło się od iOS 7. Spójrz na odpowiedź, aby zobaczyć również efekt niektórych innych właściwości .
Bhavin
proszę o pomoc w rozwiązaniu tego problemu: stackoverflow.com/questions/29923813/…
MIloš Kresović

Odpowiedzi:

438

Aby zmienić kolor ikony przycisku Wstecz dla określonego kontrolera nawigacyjnego *:

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

* Jeśli używasz aplikacji z więcej niż 1 kontrolerem nawigacyjnym i chcesz, aby ten kolor szewronu był stosowany do każdego z nich, możesz użyć serwera proxy wyglądu, aby ustawić szewron przycisku Wstecz dla każdego kontrolera nawigacyjnego w następujący sposób:

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

I na dokładkę, szybko (podziękowania dla Jay Mayu w komentarzach):

UINavigationBar.appearance().tintColor = UIColor.whiteColor()
DiscDev
źródło
3
Będzie to obowiązywać w całej aplikacji tylko wtedy, gdy używasz tego samego kontrolera nawigacyjnego dla całej aplikacji. Właściwie polecam sugestię Barta.
Kyle Clegg
1
Uzupełniłem swoją odpowiedź o informację o wielu kontrolerach nawigacyjnych. Nadal nie zgadzam się, że sugestia Bartka jest „poprawną” odpowiedzią, ponieważ istnieje wiele innych efektów ubocznych, gdy ustawiasz kolor odcienia całej aplikacji. Ponadto pierwotne pytanie nie dotyczyło motywu całej aplikacji, a jedynie pytanie, jak ustawić motyw przycisku Wstecz.
DiscDev
1
To nie wydaje się ustawiać koloru tylnej szewronu.
jcampbell1
2
@ jcampbell1 - z powodzeniem używam tego w kilku moich aplikacjach ... być może nie przeczytałeś zastrzeżenia dotyczącego wielu kontrolerów UINavigationControllers.
DiscDev,
7
na szybkieUINavigationBar.appearance().tintColor = UIColor.whiteColor()
Jay Mayu
57

Musisz ustawić tintColor całej aplikacji.

self.window.tintColor = [UIColor redColor];

Lub w Swift 3:

self.window?.tintColor = UIColor.blue

Źródło: Przewodnik dotyczący przenoszenia interfejsu użytkownika w iOS 7

Bart van Kuik
źródło
4
Jeśli chcesz ustawić tylko kolor szewronu przycisku Wstecz (a nie całej aplikacji), jak stwierdzono w pierwotnym pytaniu, to jest zła odpowiedź. Zobacz moją odpowiedź tutaj, aby uzyskać poprawną odpowiedź: stackoverflow.com/a/18809412/1103584
DiscDev
Użyłem tego w moim delegacie aplikacji, aby zmienić przyciski z tyłu na czarne. Umieść w metodzie applicationDidFinishLaunchingWithOptions ... window.tintColor = [UIColor blackColor];
Marc Watson,
To nie może działać na iOS 6. Ktoś wie, co robić?
Gavjr
1
To spowodowało, że wpłynęło to na tintColor całej aplikacji, która obejmuje dowolny UIActivityViewController (do udostępniania) i MFMailComposeViewController (do wysyłania wiadomości e-mail). Te okna dialogowe zakładają, że tintColor nie został zmodyfikowany za pomocą ... i może powodować brzydkie interakcje kolorów.
Mike Lambert
Zmienia to kolor tinty wielu innych obiektów, takich jak migający kursor UITextField. Zdecydowanie nie polecam.
Hunter Monk
55

Możesz ustawić kolor na całym pasku nawigacji aplikacji za pomocą tej metody

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
(NSDictionary *)launchOptions{
    [[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
}
David Castro
źródło
23

W ten sposób można zmienić tylko kolor strzałki (nie kolor tytułu przycisku wstecz):

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

Pasek nawigacji zawiera widok podrzędny typu _UINavigationBarBackIndicatorView (ostatni element w tablicy subviews), który reprezentuje strzałkę.

Rezultatem jest pasek nawigacyjny z różnymi kolorami strzałki przycisku Wstecz i tytułu przycisku Wstecz

selmad
źródło
4
W zależności od kolejności podglądów podrzędnych widoków systemowych to zły pomysł.
Glenn Maynard,
2
zadziałało, gdy ustawienie self.navigationController.navigationBar.tintColor nie działało.
Rich Fox
@GlennMaynard Masz rację - najlepszym sposobem na zaimplementowanie tego byłoby iterowanie przez tablicę podglądów podrzędnych zwracanych przez self.navigationController.navigationBar.subviewsaż do znalezienia przycisku Wstecz.
Evan R
@EvanR, chociaż rozwiązanie selmada zadziałało dla mnie, iteracja przez szereg podglądów podrzędnych nie zadziałała (co wypróbowałem najpierw, ponieważ zgadzam się z tobą, że byłoby mądrze to zrobić). Jeśli to działa u Ciebie - dodaj przykład. Dzięki.
jungledev
22

Jeśli używasz scenorysów, możesz ustawić kolor odcień paska nawigacji.

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

UŻYTKOWNIK
źródło
Dokładnie to, czego szukałem. Dziękuję Ci!
Chad Lewis
11

Wewnątrz rootViewController, który inicjuje navigationController, umieściłem ten kod w mojej metodzie 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]];
John Riselvato
źródło
2
UITextAttributeTextColor jest przestarzała w iOS 7 - użyj NSForegroundColorAttributeName
amergin
7

W iOS 6 tintColor zabarwiło tło pasków nawigacji, pasków kart, pasków narzędzi, pasków wyszukiwania i pasków zakresu. Aby zabarwić tło paska w systemie iOS 7, użyj zamiast tego właściwości barTintColor.

Zasoby projektowe iOS 7 Przewodnik przejścia z interfejsu użytkownika iOS 7

Chamath Jeevan
źródło
2
To jest jeden! ... umieść go w delegacie aplikacji. Działa jak marzenie! window.tintColor = [UIColor blackColor]; // Chciałem czarny
Marc Watson,
6

Możesz ustawić tintColorwłaściwość przycisku (lub elementu przycisku paska) lub widoku kontrolera widoku. Domyślnie właściwość odziedziczy tintę z widoku nadrzędnego aż do najwyższego poziomu UIWindowaplikacji.

Mike Weller
źródło
1
Dzięki za odpowiedzi. Jednak działa to trochę inaczej na iOS 7. Mój stary kod korzystał z tintColor, ale iOS 7 nie wygląda na to, żeby go tak bardzo lubił. Skończyło się na tym, że skorzystałem z oficjalnego przewodnika przejścia Apple Dev iOS 7, aby naprawić niektóre problemy z interfejsem użytkownika
kevinl
Zobacz moją odpowiedź na dyskretny przykład, jak to zrobić: stackoverflow.com/a/18809412/1103584
DiscDev
5

Musiałem użyć obu:

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

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

I działa dla mnie, dziękuję wszystkim!

Márcia Silva
źródło
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];

}
MaxEcho
źródło
Wspaniały. Pomogło mi. Dzięki
Yogesh Lolusare
4

Zaktualizuj Swift 3

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

Wynik: wprowadź opis obrazu tutaj

Ricardo Mutti
źródło
3

Aby zmienić NavigationBarkolor, możesz ustawić odcień jak poniżej.

[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
Khash Nejad
źródło
Nie wpłynie to na kolor odcienia w iOS 7. Zgodnie z dokumentacją: „Ustawienie właściwości tintColor przy użyciu interfejsów API proxy wyglądu nie jest obsługiwane w iOS 7.” link
bachonk
3

W przypadku tworzenia niestandardowego przycisku Wstecz w oparciu o UIButton z obrazem strzałki, oto fragment podklasy. Za jego pomocą możesz albo utworzyć przycisk w kodzie, albo po prostu przypisać klasę w Interface Builder do dowolnego UIButton. Obraz strzałki wstecz zostanie dodany automatycznie i pokolorowany kolorem tekstu.

@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

Obraz przycisku wstecz @ 2x

Eugene Braginets
źródło
3

Jeśli chcesz zmienić tylko strzałkę wstecz, ALE w całej aplikacji, zrób to:

[[NSClassFromString(@"_UINavigationBarBackIndicatorView") appearance] 
  setTintColor:[UIColor colorWithHexString: @"#f00000"]];
orkenstein
źródło
Jest szansa, że ​​spowoduje to odrzucenie Cię ze sklepu z aplikacjami
Luke
@Luke, z powodzeniem użyłem go kilka razy. Żadnych odrzuceń. Ale tak, szansa wciąż istnieje.
orkenstein
Nadal jest prawdopodobne, że zostanie uszkodzony w przyszłej wersji iOS
Lope
1
@Lope, tak, czemu nie. Nie szukam srebrnej kuli.
orkenstein,
Iterowanie przez podglądy w iOS 10.1 pokazuje, że to nadal jest nazwa klasy, ale ustawienie jej wyglądu tak, jak pokazano tutaj, nie ma dla mnie żadnego efektu.
arlomedia
2

W iOS 7 możesz umieścić application:didFinishLaunchingWithOptions:w AppDelegate.mpliku następujący wiersz kodu :

[[UINavigationBar appearance] setTintColor:myColor];

Ustaw myColorkolor, jaki ma mieć przycisk Wstecz w całej aplikacji. Nie ma potrzeby umieszczania go w każdym pliku.

Geo1088
źródło
0

Swift 2.0: Kolorowanie paska nawigacji i przycisków

navigationController?.navigationBar.barTintColor = UIColor.blueColor()
navigationController?.navigationBar.tintColor = UIColor.whiteColor()
navigationController!.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]
AbhinayMe
źródło
0

W swift 3, aby zmienić kolor strzałki przycisku Wstecz UIBarButton

self.navigationController?.navigationBar.tintColor = UIColor.black
Dilip Jangid
źródło