iOS 7 UIBarButton Zurück Button Pfeilfarbe

172

Ich versuche, den Pfeil der Zurück-Taste zu ändern

Geben Sie hier die Bildbeschreibung ein

Ich verwende derzeit Folgendes, um die Textgröße sowie die Textfarbe auf der Zurück-Schaltfläche zu steuern:

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

Was soll ich tun, wenn ich nur die Farbe des Pfeils für die Zurück-Schaltfläche ändern möchte?

Kevinl
quelle
Haben Sie eine Lösung gefunden, um die Farbe des Pfeils für die Zurück-Schaltfläche zu ändern?
OnkarK
1
@OMK Am Ende habe ich meine Infolist-Eigenschaft NavBarColor geändert, damit sie funktioniert, und dann die tatsächliche Navigationsfarbe auf eine andere Farbe eingestellt. Ich bin nicht sicher, was los war, aber diese Lösung hat bei mir
funktioniert
1
Das Verhalten einiger Eigenschaften von UINavigationBarhat sich gegenüber iOS 7 geändert. Sehen Sie sich die Antwort an, um die Auswirkungen einiger anderer Eigenschaften zu sehen .
Bhavin
Bitte helfen Sie bei diesem Problem: stackoverflow.com/questions/29923813/…
MIloš Kresović

Antworten:

438

So ändern Sie die Chevron-Farbe der Zurück-Taste für einen bestimmten Navigationscontroller *:

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

* Wenn Sie eine App mit mehr als einem Navigationscontroller verwenden und möchten, dass diese Chevron-Farbe auf jeden angewendet wird, können Sie den Erscheinungsbild-Proxy verwenden, um den Chevron der Zurück-Schaltfläche für jeden Navigationscontroller wie folgt festzulegen:

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

Und für ein gutes Maß schnell (danke an Jay Mayu in den Kommentaren):

UINavigationBar.appearance().tintColor = UIColor.whiteColor()
DiscDev
quelle
3
Dies gilt nur für die gesamte App, wenn Sie für Ihre gesamte App denselben Navigationscontroller verwenden. Ich empfehle tatsächlich Barts Vorschlag.
Kyle Clegg
1
Ich habe meine Antwort mit einem Hinweis zu mehreren Navigationscontrollern aktualisiert. Ich stimme immer noch nicht zu, dass Barts Vorschlag die "richtige" Antwort ist, da es viele andere Nebenwirkungen gibt, wenn Sie die Farbtonfarbe der gesamten App einstellen. Außerdem wurde in der ursprünglichen Frage nicht gefragt, wie die gesamte App gestaltet werden soll, sondern nur, wie die Schaltfläche "Zurück" gestaltet werden soll.
DiscDev
1
Dies scheint die Farbe des hinteren Chevrons nicht zu bestimmen.
jcampbell1
2
@ jcampbell1 - Ich verwende dies erfolgreich in mehreren meiner Apps ... Vielleicht haben Sie den Vorbehalt über mehrere UINavigationController nicht gelesen.
DiscDev
7
für schnellUINavigationBar.appearance().tintColor = UIColor.whiteColor()
Jay Mayu
57

Sie müssen die tintColor der gesamten App einstellen.

self.window.tintColor = [UIColor redColor];

Oder in Swift 3:

self.window?.tintColor = UIColor.blue

Quelle: iOS 7 UI Transition Guide

Bart van Kuik
quelle
4
Wenn Sie nur die Farbe des Chevrons der Zurück-Taste (und nicht der gesamten App) einstellen möchten, wie in der ursprünglichen Frage angegeben, ist dies die falsche Antwort. Siehe meine Antwort hier für die richtige Antwort: stackoverflow.com/a/18809412/1103584
DiscDev
Ich habe dies in meinem App-Delegaten verwendet, um meine Zurück-Schaltflächen in Schwarz zu ändern. In die applicationDidFinishLaunchingWithOptions-Methode einfügen ... window.tintColor = [UIColor blackColor];
Marc Watson
Dies kann unter iOS 6 nicht funktionieren. Weiß jemand, was zu tun ist?
Gavjr
1
Dies hatte Auswirkungen auf die tintColor der gesamten App, einschließlich aller UIActivityViewController (zum Teilen) und des MFMailComposeViewController (zum Senden von E-Mails). Diese Dialoge setzen voraus, dass tintColor nicht mit ... geändert wurde und zu hässlichen Farbinteraktionen führen kann.
Mike Lambert
Dadurch wird die Farbtonfarbe vieler anderer Objekte geändert, z. B. des blinkenden Cursors UITextField. Auf keinen Fall zu empfehlen.
Hunter Monk
55

Mit dieser Methode können Sie die Farbe in der gesamten Navigationsleiste der App festlegen

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

Auf diese Weise können Sie nur die Farbe des Pfeils (nicht die Farbe des Titels der Zurück-Schaltfläche) ändern:

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

Die Navigationsleiste enthält eine Unteransicht vom Typ _UINavigationBarBackIndicatorView (letztes Element im Array der Unteransichten), die den Pfeil darstellt.

Ergebnis ist eine Navigationsleiste mit verschiedenen Farben des Pfeils der Zurück-Taste und des Titels der Zurück-Taste

Selmad
quelle
4
Abhängig von der Reihenfolge der Unteransichten von Systemansichten ist dies eine schlechte Idee.
Glenn Maynard
2
Dies funktionierte, wenn das Festlegen von self.navigationController.navigationBar.tintColor nicht funktionierte.
Rich Fox
@GlennMaynard Sie haben Recht - der beste Weg, dies zu implementieren, besteht darin, das Array der zurückgegebenen Unteransichten zu durchlaufen, self.navigationController.navigationBar.subviewsbis die Schaltfläche "Zurück" gefunden wird.
Evan R
@EvanR, während die Lösung von selmad für mich funktioniert hat, hat das Durchlaufen der verschiedenen Unteransichten nicht funktioniert (was ich zuerst versucht habe, weil ich Ihnen zustimme, dass es ratsam wäre, dies zu tun). Wenn es für Sie funktioniert, fügen Sie bitte ein Beispiel hinzu. Vielen Dank.
Jungledev
22

Wenn Sie Storyboards verwenden, können Sie die Farbfarbe der Navigationsleiste festlegen.

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

DIE VERWENDUNG
quelle
Genau das, wonach ich gesucht habe. Danke dir!
Chad Lewis
11

Im rootViewController, der den Navigationscontroller initialisiert, habe ich diesen Code in meine viewDidAppear-Methode eingefügt:

//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
quelle
2
UITextAttributeTextColor ist in iOS 7 veraltet - verwenden Sie NSForegroundColorAttributeName
Amergin
7

In iOS 6 hat tintColor den Hintergrund von Navigationsleisten, Registerkartenleisten, Symbolleisten, Suchleisten und Bereichsleisten getönt. Verwenden Sie stattdessen die Eigenschaft barTintColor, um einen Balkenhintergrund in iOS 7 zu tönen.

iOS 7-Designressourcen iOS 7 UI-Übergangshandbuch

Chamath Jeevan
quelle
2
Das ist der eine! ... in den App-Delegaten einfügen. Klappt wunderbar! window.tintColor = [UIColor blackColor]; // Ich wollte schwarz
Marc Watson
6

Sie können die tintColorEigenschaft für die Schaltfläche (oder das Balkenschaltflächenelement) oder die Ansicht des Ansichtscontrollers festlegen . Standardmäßig erbt die Eigenschaft den Farbton von der übergeordneten Ansicht bis zur obersten Ebene UIWindowIhrer App.

Mike Weller
quelle
1
Danke für die Antwort. Unter iOS 7 funktioniert es jedoch etwas anders. Mein alter Code verwendete tintColor, aber iOS 7 scheint es nicht so sehr zu mögen.
Am
In meiner Antwort finden Sie ein diskretes Beispiel dafür: stackoverflow.com/a/18809412/1103584
DiscDev
5

Ich musste beide verwenden:

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

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

Und arbeitet für mich, danke für alle!

Márcia Silva
quelle
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
quelle
Toll. Es hat mir geholfen. Vielen Dank
Yogesh Lolusare
4

Aktualisieren Sie Swift 3

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

Ergebnis: Geben Sie hier die Bildbeschreibung ein

Ricardo Mutti
quelle
3

Um die NavigationBarFarbe zu ändern , können Sie die Farbtonfarbe wie unten einstellen.

[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
Khash Nejad
quelle
Dies hat keine Auswirkungen auf die Farbtonfarbe in iOS 7. In den Dokumenten heißt es: "Das Festlegen der tintColor-Eigenschaft mithilfe der Erscheinungs-Proxy-APIs wird in iOS 7 nicht unterstützt." Link
Bachonk
3

Für den Fall, dass Sie eine benutzerdefinierte Zurück-Schaltfläche basierend auf UIButton mit Pfeilbild erstellen, finden Sie hier das Unterklassen-Snippet. Mit dieser Funktion können Sie entweder eine Schaltfläche im Code erstellen oder einer beliebigen UIButton-Klasse im Interface Builder eine Klasse zuweisen. Zurück Pfeil Bild wird automatisch hinzugefügt und mit Textfarbe gefärbt.

@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

Zurück-Taste Bild @ 2x

Eugene Braginets
quelle
3

Wenn Sie nur den Zurückpfeil ABER in der gesamten App ändern möchten, gehen Sie folgendermaßen vor:

[[NSClassFromString(@"_UINavigationBarBackIndicatorView") appearance] 
  setTintColor:[UIColor colorWithHexString: @"#f00000"]];
Orkenstein
quelle
Es besteht die Möglichkeit, dass Sie aus dem App Store abgelehnt werden
Luke
@ Luke, ich habe es mehrmals erfolgreich verwendet. Keine Ablehnungen. Aber ja, der Zufall besteht immer noch.
Orkenstein
Es ist immer noch wahrscheinlich, dass es in der zukünftigen iOS-Version kaputt geht
Lope
1
@Lope, ja, warum nicht. Ich suche keine Silberkugel.
Orkenstein
Das Durchlaufen der Unteransichten unter iOS 10.1 zeigt, dass dies immer noch der Klassenname ist, aber das Festlegen des hier gezeigten Erscheinungsbilds hat für mich keine Auswirkungen.
Arlomedia
2

In iOS 7 können Sie die folgende Codezeile application:didFinishLaunchingWithOptions:in Ihre AppDelegate.mDatei einfügen :

[[UINavigationBar appearance] setTintColor:myColor];

Stellen Sie myColordie Farbe ein, die die Zurück-Schaltfläche in der gesamten App haben soll. Sie müssen es nicht in jede Datei einfügen.

Geo1088
quelle
0

Swift 2.0: Farbnavigationsleiste und Schaltflächen

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

In Swift 3 können Sie die Pfeilfarbe der UIBarButton-Zurück-Schaltfläche ändern

self.navigationController?.navigationBar.tintColor = UIColor.black
Dilip Jangid
quelle