2010-06-26 10 views
14

Sto usando la proprietà titleView di UINavigationItem per impostare un UILabel personalizzato con la dimensione/colore del carattere desiderato. Ecco il mio codice:UINavigationItem titleVisualizza posizione

self.headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 400.0, 44.0)]; 
self.headerLabel.textAlignment = UITextAlignmentCenter; 
self.headerLabel.backgroundColor = [UIColor clearColor]; 
self.headerLabel.font = [UIFont boldSystemFontOfSize:20.0]; 
self.headerLabel.textColor = [UIColor colorWithRed:0.259 green:0.280 blue:0.312 alpha:1.0]; 
self.navigationItem.titleView = self.headerLabel; 

Nella barra di navigazione ho anche un pulsante della barra di sinistra. Il risultato è questo:

alt text http://cl.ly/41164eec656c96e7c913/content

Come si può vedere, il testo non è correttamente centrato. Ho provato a impostare l'origine x dell'etichetta, ma ciò non ha alcun effetto.

+0

vedo alcuna immagine ... – turingtested

risposta

15

Se si rende l'etichetta di intestazione una vista secondaria di titleView, è possibile quindi impostare il frame di headerLabel per controllare dove si trova all'interno di titleView.

Il modo in cui lo stai facendo ora, non hai quel controllo. Penso che il sistema operativo scelga la cornice di titleView per te in base allo spazio disponibile.

Spero che questo aiuti!

+0

Ehi, ho provato questo, ma il mio titleView sta ottenendo spingere leggermente verso il basso quando ho un pulsante a sinistra oa destra. Sei riuscito a impedire che ciò accada? – quantumpotato

+0

My titleView non viene nemmeno mostrato facendo questo ... – sebrock

+0

Questo non funziona neanche per me, cosa sto sbagliando qui? L'headerLabel non appare affatto quando faccio [self.navigationItem.titleView addSubview: headerLabel] ;. Devo impostare il titleView su qualcosa prima? –

1

Basta calcolare dimensione esatta cornice necessaria e allineare a sinistra:

UIFont* font = [UIFont fontWithName:@"Bitsumishi" size:20]; 
CGSize maximumLabelSize = CGSizeMake(296,9999); 
CGSize expectedLabelSize = [title sizeWithFont:font constrainedToSize:maximumLabelSize lineBreakMode:UILineBreakModeCharacterWrap]; 
CGRect frame = CGRectMake(0, 0, expectedLabelSize.width, expectedLabelSize.height); 
UILabel *label = [[[UILabel alloc] initWithFrame:frame] autorelease]; 
label.font = font; 
label.textAlignment = UITextAlignmentLeft; 
label.text = title; 
self.titleView = label; 
0
UIView *vw = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 40)]; 
UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 40)]; 
lbl.text = @"Home"; 
lbl.textAlignment = UITextAlignmentCenter; 
lbl.backgroundColor = [UIColor clearColor]; 
lbl.textColor = [UIColor whiteColor]; 
lbl.font = [UIFont fontWithName:@"HelveticaNeue-Bold" size:20]; 
lbl.shadowColor = [UIColor blackColor]; 
lbl.shadowOffset = CGSizeMake(0,1); 
self.navigationItem.titleView = vw; 
[self.navigationItem.titleView addSubview:lbl]; 
19

Invece di initWithFrame basta usare init e mettere [self.headerLabel sizeToFit]dopo l'ultima riga di codice.

+2

Funziona come un fascino. Nessuno avrebbe dovuto votare questo. –

+0

Non ho votato, ma posso vedere come qualcuno potrebbe obiettare che non risponde alla domanda posta, ma offre un utile trucco tangenziale. – Olie

3

Ho usato etichette titolo personalizzate per le mie barre di navigazione in ogni app che ho nell'app store. Ho provato molti modi diversi per farlo e per lontano il modo più semplice per usare un'etichetta personalizzata in una barra di navigazione è ignorare completamente titleView e inserire l'etichetta direttamente in navigationController.view.

Con questo approccio, è facile avere il frame dell'etichetta del titolo sempre corrispondente al frame della navigationBar, anche se si utilizza un navBar personalizzato con una dimensione non standard.

- (void)viewDidLoad { 
    [self.navigationController.view addSubview:self.titleLabel]; 
    [super viewDidLoad]; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation: 
      (UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 

- (void)didRotateFromInterfaceOrientation: 
      (UIInterfaceOrientation)fromInterfaceOrientation { 
    [self frameTitleLabel]; 
} 

- (UILabel *) titleLabel { 
    if (!titleLabel) { 
     titleLabel = [[UILabel alloc]   
      initWithFrame:self.navigationController.navigationBar.frame]; 

     titleLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:18]; 
     titleLabel.text = NSLocalizedString(@"Custom Title", nil); 
     titleLabel.textAlignment = UITextAlignmentCenter; 
     titleLabel.lineBreakMode = UILineBreakModeTailTruncation; 
    } 
    return titleLabel; 
} 

- (void) frameTitleLabel { 
    self.titleLabel.frame = self.navigationController.navigationBar.frame; 
} 

L'unico avvertimento a questo approccio è che il vostro titolo può scorrere sopra la parte superiore di tutti i tasti che avete nella barra di navigazione, se non si è attenti e impostare il titolo di essere troppo lungo. Ma, IMO, è molto meno problematico da gestire di 1) Il titolo non si centra correttamente quando hai un RightBarButton o 2) Il titolo non appare se hai un LeftBarButton.

+1

Grazie per il commento. Come nota, quando ho implementato il tuo approccio, la vista creata non è scomparsa quando si preme il pulsante Indietro. –

3

Ho lo stesso problema; Ho solo in qualche modo risolto questo problema calcolando la lunghezza del titolo e impostando la larghezza del riquadro dell'etichetta di conseguenza. Anche se questo non è perfetto ma può essere gestibile. Ecco il codice.

label = [[UILabel alloc] init]; 
label.backgroundColor = [UIColor clearColor]; 
label.font = [ UIFont fontWithName: @"XXII DIRTY-ARMY" size: 32.0 ]; 
label.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.0f]; 
label.textAlignment = UITextAlignmentCenter; 
label.textColor =[UIColor orangeColor]; 
//label.text=categoryTitle; 
CGFloat verticalOffset = 2; 
NSString *reqSysVer = @"5.0"; 
NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; 
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending)   
{ 
    if (categoryTitle.length > 8) 
    { 
    label.frame = CGRectMake(0, 0, 300, 44); 
    }else { 
     label.frame = CGRectMake(0, 0, 80, 44); 
    } 

    self.navigationItem.titleView = label; 
    self.navigationItem.title=label.text; 
    [[UINavigationBar appearance] setTitleVerticalPositionAdjustment:verticalOffset forBarMetrics:UIBarMetricsDefault]; 
    [[UIBarButtonItem appearance] setTintColor:[UIColor newBrownLight]]; 


} 
0

Ciò che ha funzionato per me era aggiornare il frame titleView nel metodo viewDidAppear.

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    UIView *titleView = self.navigationItem.titleView; 
    CGRect navBarFrame = self.navigationController.navigationBar.frame; 
    [titleView setFrame:CGRectMake((CGRectGetWidth(navBarFrame) - TitleWidth)/2, (CGRectGetHeight(navBarFrame) - TitleHeight)/2, TitleWidth, TitleHeight)]; 
} 
Problemi correlati