iOS 7 UIBarButton botão voltar seta cor


172

Estou tentando alterar a seta do botão Voltar

insira a descrição da imagem aqui

Atualmente, estou usando o seguinte para controlar o tamanho do texto e a cor do texto no botão Voltar:

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

mas se eu quiser alterar apenas a cor da seta para o botão Voltar, o que devo fazer?


Você encontrou alguma solução para alterar a cor da seta no botão Voltar?
precisa saber é o seguinte

1
@OMK Acabei alterando minha propriedade infolist NavBarColor para fazê-la funcionar e, em seguida, defina a cor da barra de navegação real para uma cor diferente. Eu não estou certo o que estava acontecendo, mas essa solução funcionou para mim
kevinl

1
O comportamento de algumas das propriedades de UINavigationBarfoi alterado no iOS 7. Dê uma olhada na resposta para ver também o efeito de algumas outras propriedades .
Bhavin

Respostas:


438

Para alterar a cor da divisa do botão Voltar para um controlador de navegação específico *:

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

* Se você estiver usando um aplicativo com mais de um controlador de navegação e desejar que essa cor da divisa se aplique a cada um, convém usar o proxy de aparência para definir a divisa do botão voltar para cada controlador de navegação, da seguinte maneira:

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

E, por uma boa medida, rapidamente (graças a Jay Mayu nos comentários):

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

3
Isso só será aplicado em todo o aplicativo se você estiver usando o mesmo controlador de navegação para todo o aplicativo. Na verdade, recomendo a sugestão de Bart.
Kyle Clegg

1
Atualizei minha resposta com uma observação sobre vários controladores de navegação. Ainda não concordo que a sugestão de Bart seja a resposta "correta", porque existem muitos outros efeitos colaterais quando você define a cor da tonalidade de todo o aplicativo. Além disso, a pergunta original não perguntava como tema o aplicativo inteiro, estava apenas perguntando como tema o botão Voltar.
DiscDev 25/09

1
Isso não parece definir a cor da viga traseira.
jcampbell1

2
@ jcampbell1 - Estou usando isso em vários de meus aplicativos com sucesso ... talvez você não tenha lido a ressalva sobre vários UINavigationControllers.
DiscDev 27/01

7
para swiftUINavigationBar.appearance().tintColor = UIColor.whiteColor()
Jay Mayu

57

Você precisa definir o tintColor de todo o aplicativo.

self.window.tintColor = [UIColor redColor];

Ou no Swift 3:

self.window?.tintColor = UIColor.blue

Fonte: Guia de transição da interface do usuário do iOS 7


4
Se você deseja definir apenas a cor do botão de retorno (e não o aplicativo inteiro), conforme indicado na pergunta original, esta é a resposta errada. Veja minha resposta aqui para a resposta correta: stackoverflow.com/a/18809412/1103584
DiscDev

Eu usei isso no meu representante do aplicativo para alterar meus botões voltar para preto. Coloque no método applicationDidFinishLaunchingWithOptions ... window.tintColor = [UIColor blackColor];
Marc Watson

Isso não funciona no iOS 6. Alguém sabe o que fazer?
Gavjr

1
Isso fez com que afetasse a tintColor de todo o aplicativo, que inclui qualquer UIActivityViewController (para compartilhamento) e o MFMailComposeViewController (para envio de email). Essas caixas de diálogo assumem que o tintColor não foi modificado com .... e pode resultar em algumas interações feias de cores.
25815 Mike Lambert

Isso altera a cor da tonalidade de muitos outros objetos, como o cursor piscando UITextField. Definitivamente não é recomendado.
Hunter Monk

55

Você pode definir a cor em toda a barra de navegação do aplicativo usando o método

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

23

É possível alterar apenas a cor da seta (não a cor do título do botão voltar) desta maneira:

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

A barra de navegação contém uma subvisão do tipo _UINavigationBarBackIndicatorView (último item na matriz de subvisões) que representa a seta.

O resultado é uma barra de navegação com cores diferentes da seta do botão voltar e do título do botão voltar


4
Dependendo da ordem das subvisões das visualizações do sistema, é uma má idéia.
Glenn Maynard

2
isso funcionou, ao configurar self.navigationController.navigationBar.tintColor não funcionou.
Rich Fox

@GlennMaynard Você está certo - a melhor maneira de implementar isso seria percorrer a matriz de subviews retornadas self.navigationController.navigationBar.subviewsaté que o botão voltar seja encontrado.
Evan R

@EvanR, enquanto a solução da selmad funcionou para mim, a iteração através da matriz de subvisões não funcionou (o que eu tentei primeiro porque concordo com você que seria sensato fazê-lo). Se funcionar para você, adicione um exemplo. Obrigado.
precisa saber é o seguinte


11

Dentro do rootViewController que inicializa o navigationController, coloquei esse código no meu 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]];

2
UITextAttributeTextColor foi descontinuado no iOS 7 - use NSForegroundColorAttributeName
amergin


6

Você pode definir a tintColorpropriedade no botão (ou item do botão de barra) ou na visualização do controlador de exibição. Por padrão, a propriedade herdará a tonalidade da visualização pai, até o nível superior UIWindowdo seu aplicativo.


1
Obrigado pela resposta. No entanto, ele funciona de maneira um pouco diferente no iOS 7. Meu código antigo estava usando o tintColor, mas o iOS 7 parece não gostar tanto. Acabei usando o guia 7 de transição oficial da Apple Dev iOS para corrigir alguns dos problemas de interface do usuário
kevinl

Veja minha resposta para um exemplo discreto de como fazer isso: stackoverflow.com/a/18809412/1103584
DiscDev

5

Eu tive que usar os dois:

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

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

E funciona para mim, obrigado por todos!


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

}

Ótimo. Isso me ajudou. Obrigado
Yogesh Lolusare

4

Atualização 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: insira a descrição da imagem aqui


3

Apenas para alterar a NavigationBarcor, você pode definir a cor da tonalidade como abaixo.

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

Isso não afetará a cor da tonalidade no iOS 7. De acordo com os documentos: "A configuração da propriedade tintColor usando as APIs de proxy de aparência não é suportada no iOS 7." link
bachonk

3

Caso você esteja criando um botão voltar personalizado com base no UIButton com imagem de seta, aqui está o trecho da subclasse. Com ele, você pode criar um botão no código ou apenas atribuir uma classe no Interface Builder a qualquer UIButton. Seta para trás A imagem será adicionada automaticamente e colorida com a cor do 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

imagem do botão voltar @ 2x


3

Se você deseja alterar apenas a Seta para trás, MAS no aplicativo inteiro, faça o seguinte:

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

Há uma chance de isso iria levá-lo rejeitado na App Store
Lucas

@ Lucas, eu usei com sucesso várias vezes. Sem rejeições. Mas sim, o acaso ainda existe.
Orkenstein 6/02/15

Ainda é provável que ele vai ficar quebrado no futuro versão iOS
Lope

1
@Ope, sim, por que não? Eu não estou procurando por bala de prata.
Orkenstein

A iteração pelas subvisões no iOS 10.1 mostra que esse ainda é o nome da classe, mas definir sua aparência como mostrado aqui não tem efeito para mim.
Arlomedia

2

No iOS 7, você pode inserir a seguinte linha de código application:didFinishLaunchingWithOptions:em seu AppDelegate.marquivo:

[[UINavigationBar appearance] setTintColor:myColor];

Defina myColora cor em que você deseja que o botão Voltar esteja em todo o aplicativo. Não há necessidade de colocá-lo em todos os arquivos.


0

Swift 2.0: barra de navegação para colorir e botões

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

0

No swift 3, para alterar a cor da seta do botão Voltar do UIBarButton

self.navigationController?.navigationBar.tintColor = UIColor.black
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.