Como altero o título do botão "voltar" na barra de navegação


224

Atualmente, o valor padrão do botão da barra esquerda é o título da visualização que carregou a atual, ou seja, a visualização a ser mostrada quando o botão é pressionado (botão voltar).

Quero alterar o texto mostrado no botão para outra coisa.

Tentei colocar a seguinte linha de código no método viewDidLoad do controlador de exibição, mas ele não parece funcionar.

self.navigationItem.leftBarButtonItem.title = @"Log Out";

O que devo fazer?

Obrigado.

Respostas:


345

Isso deve ser colocado no método que chama o ViewController intitulado "NewTitle". Logo antes da instrução push ou popViewController.

UIBarButtonItem *newBackButton = 
        [[UIBarButtonItem alloc] initWithTitle:@"NewTitle" 
                                         style:UIBarButtonItemStyleBordered 
                                        target:nil 
                                        action:nil];
[[self navigationItem] setBackBarButtonItem:newBackButton];
[newBackButton release];

47
Quando estiver no controlador de exibição filho, chamar isso do controlador de exibição filho não funcionará. Você deve chamar isso do controlador de exibição pai, enquanto estiver no controlador de exibição filho.
21811 Alex Reynolds

2
Para alterar o botão Voltar do meu controlador de exibição de terceiro nível (segundo empurrão), tive que usar a seguinte linha em vez da resposta acima: [[self.parentViewController navigationItem] setBackBarButtonItem: newBackButton]; Estou fazendo algo errado?
JonB

4
Jordan diz que "[acrescentou] um pouco mais de clareza sobre onde colocar o código". Aqui está ainda mais clareza: coloque-o no primeiro controlador (também conhecido como pai), imediatamente antes da chamada para enviar o segundo controlador (conhecido como filho).
benvolioT

1
você pode criar um BaseViewController costume e colocá-lo no-viewDidLoad:
ArtFeel

2
Você não precisa fazer isso antes de pressionar ou pop. Você pode fazer isso em viewDidLoad ou loadView ou em qualquer outro lugar em que definir o título e outras propriedades para essa exibição. A resposta de Victor Bogdan abaixo é mais clara, IMHO.
Joe Strout

98

No ChildVC, isso funcionou para mim ...

self.navigationController.navigationBar.topItem.title = @"Back";

Trabalha em Swift também!

self.navigationController!.navigationBar.topItem!.title = "Back"

4
Testado e verificado no iOS 7 no Xcode 5.0.2. Isso mudará o título da tela anterior para Voltar quando você voltar a ele.
Alex Zavatone

Solução mais simples. Funciona no iOS 6 e 7. Coloque o UIViewController básico e pronto. Muito melhor que a solução IB ou configuração no vc empurrando.
Eric Chen

46
ele muda o título do controlador de exibição anterior, esse é o problema nesta solução
Nikita

2
@Nikita, você pode configurar o bloco novamente em viewWillDisappear
Dan Beaulieu

81

Aqui está a documentação para backBarButtonItem :

"Quando este item de navegação está imediatamente abaixo do item superior da pilha, o controlador de navegação deriva o botão Voltar da barra de navegação a partir deste item de navegação. [...] Se você deseja especificar uma imagem ou título personalizado para o botão Voltar , você pode atribuir um item de botão de barra personalizado (com seu título ou imagem personalizado) a essa propriedade. "

View Controller A (o controlador de exibição "pai" ):

self.title = @"Really Long Title";
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Short" style:UIBarButtonItemStyleBordered target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;

Quando qualquer outro controlador de visualização B está no topo da pilha de navegação e A está logo abaixo, o botão voltar de B terá o título "Curto" .


4
a parte complicada é que você precisa definir o botão Voltar no controlador de exibição PARENT e não na exibição filho. Perder uma hora acabou de descobrir isso.
Merkurial 13/05

56

no Xcode 4.5 usando storyboard, de longe a solução mais fácil que encontrei quando o valor do botão Voltar não precisa mudar dinamicamente é usar o campo "Botão Voltar" associado ao item de navegação do controlador de exibição para o qual você deseja que o botão "Voltar" diga outra coisa.

por exemplo, na captura de tela abaixo, quero o botão Voltar do (s) controlador (es) de exibição que pressiono para ter "Voltar" como o título do botão Voltar.

insira a descrição da imagem aqui

claro, isso não funcionará se você precisar do botão voltar para dizer algo um pouco diferente a cada vez ... existem todas as outras soluções aqui para isso.


A pergunta original não disse nada sobre o uso de storyboards, por isso é definitivamente bom que essa não seja a resposta aceita; no entanto, uma solução correta é para o desenvolvimento baseado em storyboard.
villapossu

42

Eu sei, a pergunta é muito antiga, mas encontrei uma boa solução.

UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @"Custom Title";
self.navigationController.navigationBar.topItem.backBarButtonItem = barButton;

Trabalhos do childView! Testado com iOS 7.


Isso parece funcionar apenas em um nível. Não está funcionando para um filho de um filho para mim. iOS 8.
narco

26

Talvez eu esteja sendo simplista demais, mas, na documentação da Apple, o texto é:

Se um item de botão de barra personalizado não for especificado por nenhum dos controladores de exibição, um botão voltar padrão será usado e seu título será definido como o valor da propriedade title do controlador de exibição anterior - ou seja, o controlador de exibição um nível abaixo a pilha.

A solução marcada como correta acima define um item de botão padrão do controlador pai. É a resposta certa, mas estou resolvendo o problema alterando a self.titlepropriedade do UIViewController antes de colocar o novo controlador na pilha NavigationController.

Isso atualiza automaticamente o título do botão voltar no próximo controlador e, desde que você self.titleretorne ao que deveria estar, viewWillAppearnão consigo ver esse método causando muitos problemas.


19

Isso funciona melhor para mim. Experimentar :

 self.navigationController.navigationBar.topItem.backBarButtonItem = [[UIBarButtonItem alloc] 
initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil];

19

No Swift / iOS8, o seguinte funcionou para mim:

let backButton = UIBarButtonItem(
      title: "Back Button Text",
      style: UIBarButtonItemStyle.Bordered,
      target: nil,
      action: nil
);

self.navigationController.navigationBar.topItem.backBarButtonItem = backButton;

Portado da resposta de Felipe.


A sintaxe do swift 1.1 é #self.navigationController?.navigationBar.topItem?.backBarButtonItem
Warren Burton

3
Estilo deve ser UIBarButtonItemStyle.Plain
Micro

2
Obrigado por isso. Que API verdadeiramente patética é essa. E representante do UIKit em geral. Entre as barras de navegação e as barras de status no iOS, é uma maravilha que ainda desenvolvemos para essa maldita plataforma. Obrigado baby jesus pelo Stack Overflow e seus colaboradores!
Womble

@Wobmle: Você deve desenvolver o Android por alguns meses;)
fl034

17

Ok, aqui está o caminho. Se você tem um controlador de exibição "primeiro" e navega em outro controlador de exibição "segundo" pressionando um botão ou etc., você precisa fazer algum trabalho. Primeiro, você precisa criar um BarButtonItem no "segundo" método ViewDidLoad do controlador de exibição como este;

    UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];

Depois de fazer isso, você precisa escrever no código a ação "btnBack" no mesmo arquivo .m como este;

-(IBAction)OnClick_btnBack:(id)sender  {
      [self.navigationController popViewControllerAnimated:YES];
    //[self.navigationController pushViewController:self.navigationController.parentViewController animated:YES];
}

Isso é tudo.


2
A leftBarButtonItemnão tem a aparência de a backBarButtonItem, se isso for importante no design do aplicativo.
21119 Alex Reynolds

1
Das soluções postadas (muito obrigado), esta parece funcionar, embora como Alex tenha dito acima, o botão da barra esquerda não pareça um item da barra traseira. Como posso fazer com que pareça um item da barra traseira ???
Dale

17

Eu tinha um controlador de exibição pai com um título muito longo. Isso resultou no sangramento do texto do botão Voltar no título do controlador de exibição filho.

Depois de tentar várias soluções diferentes, foi isso que acabei fazendo (expandindo a abordagem @ john.k.doe):

Usando o Xcode 7.2, Swift 2

  1. No Storyboard, adicione a Navigation Itemà cena Parent View Controller (não o VC filho)

item de navegação

  1. No Attributes Inspectorseu novo Navigation Item, digite um spacecaractere no Back Buttoncampo. Mais sobre isso mais tarde.

item de navegação em Exibir Hierarquia

adicione um caractere de espaço ao campo Botão Voltar

  1. No controlador de exibição Parent , adicione o seguinte código:

snippet:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    switch segue.destinationViewController {
    case is ChildViewController:
        navigationItem.backBarButtonItem?.title = ""
    default:
        navigationItem.backBarButtonItem?.title = "Full Parent Title"
    }
}

Explicação:

O botão Voltar pertence ao controlador de exibição pai. O Navigation Itembotão fornece um identificador para o botão Voltar, para que você possa definir o título no código ou no Storyboard.

Nota:

Se você deixar o Navigation Item Back Buttontexto como a sequência vazia padrão, o título do botão voltar se tornará "Voltar".

Outras abordagens funcionam, por que usar esta?

Embora seja possível substituir o título do botão de retorno no controlador de exibição infantil, foi um desafio identificá-lo até que ele já tivesse piscado brevemente na tela.

Algumas das abordagens constroem um novo botão de retorno e substituem o existente. Tenho certeza de que funciona e provavelmente é necessário em alguns casos de uso. Mas eu prefiro aproveitar as APIs existentes sempre que possível.

Alterar o titlecontrolador de exibição pai é a solução mais rápida para algumas situações. No entanto, isso altera o título do pai, portanto você precisa gerenciar o estado. As coisas também ficam confusas Tab Bar Controllerporque as alterações de título causam efeitos colaterais nos Tab Bar Itemtítulos.


10

Para aqueles que usam storyboards, selecione o quadro do controlador pai (e não o que está mantendo a visão de destino) (certifique-se de clicar com o botão direito do mouse na barra de navegação e abra o inspetor de atributos, onde encontrará três entradas de formulário. A terceira " botão voltar "é o que estamos procurando.


4
esta é a melhor solução se você não se importa com a localização.
MiQUEL

7

Versão rápida:

No seu ViewController filho:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.backItem?.title = "TEXT"
}

isso realmente mudará o título do controlador de exibição anterior na pilha para "TEXT", que é menor que o ideal.
Gravitron 31/05

6

Aqui está outra maneira de fazer isso.

No seu controlador de exibição pai, implemente o seguinte método:

- (void) setBackBarButtonItemTitle:(NSString *)newTitle {
  self.navigationItem.backBarButtonItem.title = newTitle;
}

No seu controlador de exibição filho, quando você deseja alterar o título, isso funcionará:

NSArray *viewControllerArray = [self.navigationController viewControllers];
int parentViewControllerIndex = [viewControllerArray count] - 2;
[[viewControllerArray objectAtIndex:parentViewControllerIndex] setBackBarButtonItemTitle:@"New Title"];

Eu nunca consegui fazer a parentViewControllerpropriedade funcionar:

[(ParentViewController *)(self.navigationController.parentViewController) setBackBarButtonItemTitle:@"New Title"];

Não sei se isso é um bug ou não o estou usando corretamente. Mas pegar o penúltimo controlador de exibição na viewControllersmatriz aponta para o controlador de exibição pai, e posso chamar os métodos pai corretamente com essa referência.


6

Está bem. Eu pessoalmente odiava todas essas opções. Portanto, eu inventei o meu.

Com base nas informações que eu vi. Parece que o controlador de visão anterior está no controle de seu próprio botão "Voltar", que será apresentado no controlador de visão pressionado.

Eu criei um método Lazy Load para o navigationItem no controlador que deseja o botão Voltar alterado.

O meu é um controlador de convite por comprador

Convidar comprador é o texto definido por padrão.

mas o botão voltar precisava ser Convidar

Aqui está o código que eu usei para criar o botão Voltar.

Coloquei esse código na parte superior do arquivo Implementatio (.m) do controlador e substituiu o método do super automaticamente.

- (UINavigationItem *)navigationItem{
    UINavigationItem *item = [super navigationItem];
    if (item != nil && item.backBarButtonItem == nil)
    {
        item.backBarButtonItem = [[[UIBarButtonItem alloc] init] autorelease];
        item.backBarButtonItem.title = @"Invite";
    }

    return item;
}

Eu sinto que essa é uma maneira muito mais elegante de conseguir isso.

Coloco esse código em um único local e ele é preenchido automaticamente quando necessário.

Não é necessário chamar o código antes de cada solicitação de envio.

Espero que isto ajude


5
UIBarButtonItem *btnBack = [[UIBarButtonItem alloc]
                                   initWithTitle:@"Back" 
                                   style:UIBarButtonItemStyleBordered
                                   target:self
                                   action:@selector(OnClick_btnBack:)];
    self.navigationItem.leftBarButtonItem = btnBack;
    [btnBack release];

5

Aqui está a resposta:

Em viewDidAppear:animated(NÃO em viewDidLoad), faça o seguinte

- (void)viewDidAppear:(BOOL)animated
{
     [self.navigationController.navigationBar.backItem setTitle:@"anything"];

     // then call the super
     [super viewDidAppear:animated];
}

Isso se você quiser manter a forma do botão Voltar.


Nada mal, exceto que eles podem vê-lo mudar de título. Eu tentei no viewWillAppear e não funciona.
Travis M.

5

Nenhuma das soluções explicadas aqui funcionou para mim. Então, o que eu fiz foi remover o título da cena de onde vim da seguinte maneira:

self.title = @"";

Portanto, quando uma nova cena é apresentada, o texto de trás não aparece.

Concordo plenamente que essa não é uma solução clara, mas funcionou e nenhuma das explicações funcionou para mim.


Cara, eu tenho que te dizer, é 2017 e ainda é uma dor no a $$ manipular o botão voltar. Seu método funcionou para mim e eu acabei com o sinal "<", embora quisesse a palavra "Cancelar", mas aceitarei o que recebi. :)
AnBisw

5

Descobri que é melhor alterar o título do controlador de exibição atual na pilha de navegação para o texto desejado do botão voltar antes de passar para o próximo controlador de exibição.

Por exemplo

self.navigationItem.title = @"Desired back button text";
[self.navigationController pushViewController:QAVC animated:NO];

Em viewDidAppear, defina o título novamente para o título desejado para o VC original. Voila!


5

Para Swift:

    // Rename back button
    let backButton = UIBarButtonItem(
        title: "Back",
        style: UIBarButtonItemStyle.Plain, // Note: .Bordered is deprecated
        target: nil,
        action: nil
    )
    self.navigationController!.navigationBar.topItem!.backBarButtonItem = backButton

4

Descobri que a maneira mais fácil de alterar o nome do botão voltar é definir o título dos controladores de exibição como o título do botão voltar e, em seguida, substituir o titleView no item de navegação dos controladores de exibição por um rótulo personalizado com seu real nome.

Como isso:

CustomViewController.m

@implementation CustomViewController

- (NSString*)title {
    return @"Back Button Title";
}

- (void)viewDidLoad {
    [super viewDidLoad];
    UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero];
    customTitleView.text = @"Navigation Bar Title";
    customTitleView.font = [UIFont boldSystemFontOfSize:20];
    customTitleView.backgroundColor = [UIColor clearColor];
    customTitleView.textColor = [UIColor whiteColor];
    customTitleView.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    customTitleView.shadowOffset = CGSizeMake(0, -1);

    [customTitleView sizeToFit];

    self.navigationItem.titleView = [customTitleView autorelease];
}

@end

Isso fará com que seu título no UINavigationBar pareça nativo. Dando ao controlador de exibição a capacidade de ter título separado e título do botão Voltar.

No caso dos controladores de visualização A e B, A é responsável por informar como deve ser o botão Voltar, enquanto B é exibido.

EDIT: Isso também mantém a aparência nativa do botão Voltar (o item do botão da barra com seta para a esquerda).


4

Este código também funciona. Coloque isso no controlador raiz do controlador de navegação:

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

4

Sou novo no iOS, mas fornecerei minha resposta muito simples de substituir a classe do controlador de navegação. Eu tenho simples substituir os métodos push e pop e salvar o título do controlador de exibição anterior. Desculpe por colar no bloco js. Estava um pouco confuso como colá-lo no bloco de código normal.

#import "MyCustomNavController.h"


@implementation MyCustomNavController {

    NSString *_savedTitle;
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated withBackBtnTitle:(NSString *)title {
    _savedTitle = self.topViewController.title;

    self.topViewController.title = title;
    [super pushViewController:viewController animated:animated];
}

- (UIViewController *)popViewControllerAnimated:(BOOL)animated {

    [self.viewControllers objectAtIndex:self.viewControllers.count - 2].title = _savedTitle;
    return [super popViewControllerAnimated:animated];
}

@end


4

self.navigationController.navigationBar.backItem.title = @"TEXT";

E em Swift:

self.navigationController?.navigationBar.backItem?.title = "TEXT"

3
self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] 
                                              initWithTitle:@"Log out" 
                                              style:UIBarButtonItemStyleDone 
                                              target:nil 
                                              action:nil] autorelease];

você pode colocá-lo onde quiser no código no controlador de controle, o que permite que você tenha botões diferentes para diferentes visões filho.


3

A maioria das soluções mata o estilo original do BackButton (o botão da barra com seta para a esquerda) enquanto adiciona um botão comum com o título desejado.
Portanto, para manter o estilo original, existem duas maneiras:
1º: Usar o estilo de botão não documentado (110 ou algo parecido) que eu prefiro não fazer. Mas se você quiser, pode encontrar como fazê-lo aqui, no stackoverflow.
2º: Para usar a idéia de Trenskow. Eu gostei e usei um pouco alterado.
Em vez de substituir o título - (NSString *), decidi manter o título original da seguinte maneira (o que me permite usar os títulos da ponta, bem como o título no push state btw).

- (void)viewDidLoad {
    [super viewDidLoad];
    static NSString * backButtonTitle=@"Back"; //or whatever u want

    if (![self.title isEqualToString:backButtonTitle]){

        UILabel* customTitleView = [[UILabel alloc] initWithFrame:CGRectZero];
        customTitleView.text = self.title; // original title
        customTitleView.font = [UIFont boldSystemFontOfSize:20];
        customTitleView.backgroundColor = [UIColor clearColor];
        customTitleView.textColor = [UIColor whiteColor];
        customTitleView.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
        customTitleView.shadowOffset = CGSizeMake(0, -1);

        [customTitleView sizeToFit];

        self.navigationItem.titleView = [customTitleView autorelease];
        self.title = backButtonTitle; 
    }
}

Esta solução funciona bem e parece nativa. Além disso, se usá-lo no método viewDidLoad, impede a execução mais de uma vez.
Também tentei a solução de Jessedc, mas parece ruim. Faz com que a barra de título do usuário seja alterada rapidamente, do original para o desejado e o do BackButton.


2

Isso funciona para mim como uma versão "simplificada" das respostas postadas anteriormente.

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] init];

backButton.title = @"Go Back";

self.navigationItem.backBarButtonItem = backButton;

Lembre-se de colocar o código dentro do controlador de exibição pai (por exemplo, a exibição que possui sua exibição de tabela ou UITableViewController), não a exibição filho ou de detalhes (por exemplo, UIViewController).

Você pode localizar facilmente a sequência do botão Voltar assim:

backButton.title = NSLocalizedString(@"Back Title", nil);

2

Temos dois VC's A e B.

Se você deseja alterar o título em B, escreva esse código em A

- (IBAction)goToBViewController:(UIButton *)sender {

    BViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"VC"];
    UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Your title here"
                                                                  style:UIBarButtonItemStylePlain
                                                                 target:nil
                                                                 action:nil];
    [[self navigationItem] setBackBarButtonItem:newBackButton];
    [self.navigationController pushViewController:vc animated:NO];

}

Swift 4.1 Xcode 9.4

let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "VC"])
let newBackButton = UIBarButtonItem.init(title: "Your title here", style: UIBarButtonItemStyle.plain, target: nil, action: nil)
navigationController?.navigationBar.topItem?.backBarButtonItem = newBackButton
navigationController?.pushViewController(secondViewController!, animated: true)

1

A resposta de Stan foi a melhor. Mas também há um problema: quando você usa o controlador com uma barra de guias e altera o título do controlador, também pode alterar o título da barra de guias. Portanto, a melhor resposta é alterar apenas o view_controller.navigationItem.title e usar o view_controller.navigationItem .título na função. A resposta está aqui: (Com o ARC e adicione-os ao viewDidLoad do view)

  static NSString * back_button_title=@"Back"; //or whatever u want
  if (![view_controller.navigationItem.title isEqualToString:back_button_title]){
    UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero];
    custom_title_view.text = view_controller.navigationItem.title; // original title
    custom_title_view.font = [UIFont boldSystemFontOfSize:20];
    custom_title_view.backgroundColor = [UIColor clearColor];
    custom_title_view.textColor = [UIColor whiteColor];
    custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    custom_title_view.shadowOffset = CGSizeMake(0, -1);

    [custom_title_view sizeToFit];

    view_controller.navigationItem.titleView = custom_title_view;
    view_controller.navigationItem.title = back_button_title;
  }

No meu uso, eu faço uma função como essa, apenas tenho o recurso com um código de linha no viewDidLoad.

+ (void)makeSubViewHaveBackButton:(UIViewController*) view_controller{
  static NSString * back_button_title=@"Back"; //or whatever u want
  if (![view_controller.navigationItem.title isEqualToString:back_button_title]){
    UILabel* custom_title_view = [[UILabel alloc] initWithFrame:CGRectZero];
    custom_title_view.text = view_controller.navigationItem.title; // original title
    custom_title_view.font = [UIFont boldSystemFontOfSize:20];
    custom_title_view.backgroundColor = [UIColor clearColor];
    custom_title_view.textColor = [UIColor whiteColor];
    custom_title_view.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
    custom_title_view.shadowOffset = CGSizeMake(0, -1);

    [custom_title_view sizeToFit];

    view_controller.navigationItem.titleView = custom_title_view;
    view_controller.navigationItem.title = back_button_title;
  }
}

1

Se você deseja não apenas alterar o texto do botão Voltar para o mesmo texto e permanecer a forma original da seta à esquerda, mas também fazer algo quando o usuário clicar no botão Voltar, recomendo que você dê uma olhada no meu " CustomNavigationController " .


1

PROBLEMA: O texto "Voltar" na barra de navegação não pode ser substituído.

MOTIVO: O rótulo "Voltar" é definido na barra de navegação após o envio de uma visualização porque o atributo .title no controlador de visualização pai foi definido como nulo (ou não inicializado).

UMA SOLUÇÃO: Se você definir self.title = "Whatever ...", verá que, em vez de "Back", aparecerá "Whatever ..." depois de pressionar o novo controlador de exibição.

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.