rótulos múltiplos em Barra de navegação

votos
3

Eu gostaria de criar uma visão semelhante à página Now Playing no iPhone e tem 3 linhas de texto na barra de navegação.

A única maneira que eu poderia encontrar para fazer isso foi:

UINavigationBar *bar = [self.navigationController navigationBar];   
label = [[UILabel alloc] initWithFrame:CGRectMake(60, 2, 200, 14)];
label.tag = SONG_TAG;
label.backgroundColor = [UIColor clearColor];
label.font = [UIFont boldSystemFontOfSize:14];
label.adjustsFontSizeToFitWidth = NO;
label.textAlignment = UITextAlignmentCenter;
label.textColor = [UIColor whiteColor];
label.highlightedTextColor = [UIColor blackColor];
[bar addSubview:label];
[label release];

//Create album label
label = [[UILabel alloc] initWithFrame:CGRectMake(60, 17, 200, 12)];
label.tag = ALBUM_TAG;
label.backgroundColor = [UIColor clearColor];
label.font = [UIFont systemFontOfSize:12];
label.adjustsFontSizeToFitWidth = NO;
label.textAlignment = UITextAlignmentCenter;
label.highlightedTextColor = [UIColor blackColor];
label.textColor = HEXCOLOR(0xA5A5A5ff);
[bar addSubview:label];
[label release];

//Create artist label
label = [[UILabel alloc] initWithFrame:CGRectMake(60, 30, 200, 12)];
label.tag = ARTIST_TAG;
label.backgroundColor = [UIColor clearColor];
label.font = [UIFont systemFontOfSize:12];
label.adjustsFontSizeToFitWidth = NO;
label.textAlignment = UITextAlignmentCenter;
label.highlightedTextColor = [UIColor blackColor];
label.textColor = HEXCOLOR(0xA5A5A5ff);
[bar addSubview:label];
[label release];

O problema com isto é que eu tenho para removê-los quando a vista alterações. Assim, em -viewWillDisappear eu tenho:

UILabel *label;
label = (UILabel *)[self.navigationController.navigationBar viewWithTag:SONG_TAG];
[label removeFromSuperview];
label = (UILabel *)[self.navigationController.navigationBar viewWithTag:ALBUM_TAG];
[label removeFromSuperview];
label = (UILabel *)[self.navigationController.navigationBar viewWithTag:ARTIST_TAG];
[label removeFromSuperview];

Acho que a maneira de fazer isso é fazer uma exibição personalizada que tem as 3 etiquetas nela, e adicione à vista título. (Aqui está o problema - você só pode adicionar um rótulo ou vista para o local vista título na barra de navegação)

self.navigationItem.titleView = newViewIMadeWithThreeLabels
Publicado 09/12/2008 em 22:57
fonte usuário
Em outras línguas...                            


7 respostas

votos
4

código UIView abaixo funciona ok para mim, você teve a mesma tag rótulo usado duas vezes, poderia ter sido o motivo do acidente.

UIView *btn = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 60)];

UILabel *label;
label = [[UILabel alloc] initWithFrame:CGRectMake(0, 10, 200, 16)];
label.tag = 1;
label.backgroundColor = [UIColor clearColor];
label.font = [UIFont boldSystemFontOfSize:16];
label.adjustsFontSizeToFitWidth = NO;
label.textAlignment = UITextAlignmentCenter;
label.textColor = [UIColor blackColor];
label.text = @"first line";
label.highlightedTextColor = [UIColor blackColor];
[btn addSubview:label];
[label release];

label = [[UILabel alloc] initWithFrame:CGRectMake(0, 30, 200, 16)];
label.tag = 2;
label.backgroundColor = [UIColor clearColor];
label.font = [UIFont boldSystemFontOfSize:16];
label.adjustsFontSizeToFitWidth = NO;
label.textAlignment = UITextAlignmentCenter;
label.textColor = [UIColor blackColor];
label.text = @"second line";
label.highlightedTextColor = [UIColor blackColor];
[btn addSubview:label];
[label release];

self.navigationItem.titleView = btn;
Respondeu 20/12/2009 em 22:37
fonte usuário

votos
2

Você poderia tentar criar um UIViewController com seus rótulos posicionados corretamente e, em seguida, instanciar ele, como UIViewControllerSubclass * sub = [[UIViewControllerSubclass alloc] o init];

Dentro da subclasse UIViewController, você teria que construir a sua visão no método loadView delegado e anexar a visão de cada etiqueta de vista do controlador de visualização, como [[auto view] addSubview: label];

Em seguida, anexar seu ponto de vista como este:

self.navigationItem.titleView = sub.view;

Isso pode funcionar.

Respondeu 09/12/2008 em 23:10
fonte usuário

votos
1

Hoje eu estava passando pelo mesmo problema e eu fiz isto deste modo.

  1. Eu criei um UIView de tamanho 320 * 44 no local 0,0 - você pode ter um tamanho de vista diferente com base em sua exigência.

  2. Criar um IBOutlet para essa exibição personalizada chamado navigationBarTitleView - fazer conexões necessárias com a sua visão

  3. Adicionar subexibição para navgiationBar com o seguinte código dentro dentro viewWillAppear: OR viewDidAppear:

    [[[Auto navigationController] NavigationBar] addSubview: navigationBarTitleView];

  4. Quando você empurra essa visão na NavigationController, remova o navigationBarTitleView do superview.

    [NavigationBarTitleView removeFromSuperview];

Respondeu 23/10/2010 em 22:29
fonte usuário

votos
1
UINavigationBar *bar = [self.navigationController navigationBar];
CGFloat navBarHeight = 70.0f;    
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight);
[bar setFrame:frame];
UILabel *label;
label = [[UILabel alloc] initWithFrame:CGRectMake(0, 10, 320, 10)];
label.tag = 1;
label.backgroundColor = [UIColor clearColor];
label.font = [UIFont boldSystemFontOfSize:12];
label.adjustsFontSizeToFitWidth = NO;
label.textAlignment = UITextAlignmentCenter;
label.textColor = [UIColor blackColor];
label.text = @"Set the details for this event.";
label.highlightedTextColor = [UIColor blackColor];
[bar addSubview:label];
[label release];
[bar release];
Respondeu 14/05/2010 em 13:13
fonte usuário

votos
1

Sua sugestão no final do post é correta. Criar um UIView que contém as 3 etiquetas e defini-lo como o titleView. Não tente adicionar subviews diretamente ao UINavigationBar.

Respondeu 10/12/2008 em 15:34
fonte usuário

votos
0

Uma maneira mais limpa é apenas para enumsua tag:

enum {
  SONG_TAG,
  ALBUM_TAG,
  ARTIST_TAG
};

Seu código deve funcionar então.

Respondeu 25/09/2010 em 19:07
fonte usuário

votos
0

I tentado adicionar toda uma vista .. No entanto, a aplicação mantidos falhe sempre que adicionado um subexibição (como um rótulo) a ele na delegado loadView. Eu não sou tão grande em depuração travamentos completos, então eu encontrei usando um botão era muito mais simples. Eu não encontrei qualquer lado afeta ainda ...

UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(0, 0, 320, 60);

UILabel *label;
label = [[UILabel alloc] initWithFrame:CGRectMake(0, 10, 200, 16)];
label.tag = SONG_TAG;
label.backgroundColor = [UIColor clearColor];
label.font = [UIFont boldSystemFontOfSize:16];
label.adjustsFontSizeToFitWidth = NO;
label.textAlignment = UITextAlignmentCenter;
label.textColor = [UIColor blackColor];
label.text = @"first line";
label.highlightedTextColor = [UIColor blackColor];
[btn addSubview:label];
[label release];

label = [[UILabel alloc] initWithFrame:CGRectMake(0, 30, 200, 16)];
label.tag = SONG_TAG;
label.backgroundColor = [UIColor clearColor];
label.font = [UIFont boldSystemFontOfSize:16];
label.adjustsFontSizeToFitWidth = NO;
label.textAlignment = UITextAlignmentCenter;
label.textColor = [UIColor blackColor];
label.text = @"second line";
label.highlightedTextColor = [UIColor blackColor];
[btn addSubview:label];
[label release];

self.navigationItem.titleView = btn;
Respondeu 15/12/2008 em 23:46
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more