Color de flecha del botón Atrás UIBarButton de iOS 7

172

Estoy tratando de cambiar la flecha del botón de retroceso

ingrese la descripción de la imagen aquí

Actualmente estoy usando lo siguiente para controlar el tamaño del texto, así como el color del texto en el botón Atrás:

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

pero si solo quiero cambiar el color de la flecha para el botón Atrás, ¿qué debo hacer?

kevinl
fuente
¿Has encontrado alguna solución para cambiar el color de la flecha para el botón Atrás?
OnkarK
1
@ OMK Terminé cambiando mi propiedad de infolist NavBarColor para que funcione y luego configuré el color de barra de navegación real en un color diferente. No estoy seguro de lo que estaba pasando, pero esa solución funcionó para mí
kevinl
1
El comportamiento de algunas de las propiedades de UINavigationBarha cambiado desde iOS 7. Eche un vistazo a la Respuesta para ver el efecto de algunas otras Propiedades también.
Bhavin
por favor ayuda con este problema: stackoverflow.com/questions/29923813/…
MIloš Kresović

Respuestas:

438

Para cambiar el color del botón Atrás del galón para un controlador de navegación específico *:

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

* Si está utilizando una aplicación con más de 1 controlador de navegación, y desea que este color de cheurón se aplique a cada uno, puede usar el proxy de apariencia para configurar el botón de retroceso para cada controlador de navegación, de la siguiente manera:

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

Y por si acaso, en forma rápida (gracias a Jay Mayu en los comentarios):

UINavigationBar.appearance().tintColor = UIColor.whiteColor()
DiscDev
fuente
3
Esto solo se aplicará a toda la aplicación si está utilizando el mismo controlador de navegación para toda la aplicación. De hecho, recomiendo la sugerencia de Bart.
Kyle Clegg
1
Actualicé mi respuesta con una nota sobre múltiples controladores de navegación. Todavía no estoy de acuerdo con que la sugerencia de Bart sea la respuesta "correcta", porque hay muchos otros efectos secundarios cuando configura el color de tinte de toda la aplicación. Además, la pregunta original no preguntaba cómo crear un tema para toda la aplicación, solo preguntaba cómo crear un tema para el botón Atrás.
DiscDev
1
Esto no parece establecer el color del galón trasero.
jcampbell1
2
@ jcampbell1 - Estoy usando esto en varias de mis aplicaciones con éxito ... tal vez no leyó la advertencia acerca de múltiples UINavigationControllers.
DiscDev
77
para swiftUINavigationBar.appearance().tintColor = UIColor.whiteColor()
Jay Mayu
57

Debe configurar el tintColor de toda la aplicación.

self.window.tintColor = [UIColor redColor];

O en Swift 3:

self.window?.tintColor = UIColor.blue

Fuente: Guía de transición de la interfaz de usuario de iOS 7

Bart van Kuik
fuente
44
Si solo desea establecer el color del botón de retroceso (y no la aplicación completa), como se indica en la pregunta original, esta es la respuesta incorrecta. Vea mi respuesta aquí para obtener la respuesta correcta: stackoverflow.com/a/18809412/1103584
DiscDev
Usé esto en mi delegado de aplicaciones para cambiar mis botones de retroceso a negro. Coloque en el método applicationDidFinishLaunchingWithOptions ... window.tintColor = [UIColor blackColor];
Marc Watson
Esto no puede funcionar en iOS 6. ¿Alguien sabe qué hacer?
Gavjr
1
Esto causó que afectara el tintColor de toda la aplicación, que incluye cualquier UIActivityViewController (para compartir) y el MFMailComposeViewController (para enviar correos electrónicos). Esos cuadros de diálogo suponen que tintColor no se ha modificado con ... y puede dar lugar a algunas interacciones de color feas.
Mike Lambert
Esto cambia el color de tinte de muchos otros objetos, como el cursor parpadeante UITextField. Definitivamente no recomendado.
Hunter Monk
55

Puede configurar el color en toda la barra de navegación de la aplicación utilizando el método

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

Es posible cambiar solo el color de la flecha (no el color del título del botón de retroceso) de esta manera:

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

La barra de navegación contiene una subvista del tipo _UINavigationBarBackIndicatorView (último elemento en la matriz de subvistas) que representa la flecha.

El resultado es una barra de navegación con diferentes colores de flecha de botón de retroceso y título de botón de retroceso

selmad
fuente
44
Dependiendo del orden de las subvistas de las vistas del sistema, es una mala idea.
Glenn Maynard el
2
esto funcionó, cuando configurar self.navigationController.navigationBar.tintColor no funcionó.
Rich Fox
@GlennMaynard Tienes razón: la mejor manera de implementar esto sería iterar a través de la matriz de subvistas devueltas self.navigationController.navigationBar.subviewshasta que se encuentre el botón Atrás.
Evan R
@EvanR, mientras que la solución de selmad funcionó para mí, iterar a través de la variedad de subvistas no lo hizo (lo que intenté primero porque estoy de acuerdo con usted en que sería aconsejable hacerlo). Si funciona para usted, agregue un ejemplo. Gracias.
jungledev
22

Si está utilizando guiones gráficos, puede establecer el color de tinte de la barra de navegación.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

EL USUARIO
fuente
Exactamente lo que estaba buscando. ¡Gracias!
Chad Lewis el
11

Dentro del rootViewController que inicializa el navigationController, pongo este código dentro de mi método 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
fuente
2
UITextAttributeTextColor está en desuso en iOS 7 - use NSForegroundColorAttributeName
amergin
7

En iOS 6, tintColor teñía el fondo de las barras de navegación, barras de pestañas, barras de herramientas, barras de búsqueda y barras de alcance. Para teñir un fondo de barra en iOS 7, use la propiedad barTintColor en su lugar.

Recursos de diseño de iOS 7 iOS 7 Guía de transición de la interfaz de usuario

Chamath Jeevan
fuente
2
¡Éste es el indicado! ... póngalo en el delegado de la aplicación. ¡Funciona de maravilla! window.tintColor = [UIColor blackColor]; // Yo quería negro
Marc Watson
6

Puede establecer la tintColorpropiedad en el botón (o elemento de botón de barra) o en la vista del controlador de vista. Por defecto, la propiedad heredará el tinte de la vista principal, hasta el nivel superior UIWindowde su aplicación.

Mike Weller
fuente
1
Gracias por la respuesta. Sin embargo, funciona un poco diferente en iOS 7. Mi antiguo código estaba usando tintColor, pero a iOS 7 no parece gustarle tanto. Terminé usando la guía de transición oficial Apple Dev iOS 7 para solucionar algunos de los problemas de la interfaz de usuario
kevinl
Vea mi respuesta para un ejemplo discreto de cómo hacer esto: stackoverflow.com/a/18809412/1103584
DiscDev
5

Tuve que usar ambos:

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

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

Y funciona para mí, ¡gracias por todos!

Márcia Silva
fuente
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
fuente
Excelente. Me ayudó. Gracias
Yogesh Lolusare
4

Actualizar Swift 3

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

Resultado: ingrese la descripción de la imagen aquí

Ricardo Mutti
fuente
3

Solo para cambiar el NavigationBarcolor, puede establecer el color del tinte como se muestra a continuación.

[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
Khash Nejad
fuente
Esto no afectará el color de tinte en iOS 7. Según los documentos: "La configuración de la propiedad tintColor mediante el uso de API de proxy de apariencia no es compatible con iOS 7". enlace
bachonk
3

En caso de que esté haciendo un botón de retroceso personalizado basado en UIButton con imagen de flecha, aquí está el fragmento de subclase. Al usarlo, puede crear un botón en el código o simplemente asignar una clase en Interface Builder a cualquier UIButton. La imagen de la flecha hacia atrás se agregará automáticamente y se coloreará con color de texto.

@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

imagen del botón de retroceso @ 2x

Eugene Braginets
fuente
3

Si desea cambiar solo la flecha hacia atrás PERO en toda la aplicación, haga lo siguiente:

[[NSClassFromString(@"_UINavigationBarBackIndicatorView") appearance] 
  setTintColor:[UIColor colorWithHexString: @"#f00000"]];
orkenstein
fuente
Hay una posibilidad de que esto te rechace de la tienda de aplicaciones
Lucas
@Luke, lo he usado con éxito varias veces. Sin rechazos. Pero, sí, todavía existe la posibilidad.
orkenstein
Todavía es probable que se rompa en la futura versión de iOS
Lope
1
@Lope, sí, por qué no. No estoy buscando una bala de plata.
orkenstein
Iterar las subvistas en iOS 10.1 muestra que ese sigue siendo el nombre de la clase, pero configurar su apariencia como se muestra aquí no tiene ningún efecto para mí.
arlomedia
2

En iOS 7, puede poner la siguiente línea de código dentro application:didFinishLaunchingWithOptions:de su AppDelegate.marchivo:

[[UINavigationBar appearance] setTintColor:myColor];

Establezca myColorel color que desea que tenga el botón Atrás en toda la aplicación. No es necesario ponerlo en cada archivo.

Geo1088
fuente
0

Swift 2.0: barra de navegación para colorear y botones

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

En Swift 3, para cambiar el color de la flecha del botón Atrás UIBarButton

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