2010-06-03 11 views
6

sto usando un UILabel per la titleView di una barra di navigazione (sto facendo semplice browser web in-app). Funziona bene, tranne che quando presento un controller di visualizzazione modale, titleView si sposta dal centro della barra di navigazione all'estrema sinistra (sotto il pulsante indietro). Ho provato in 3.0 e fino. Ecco codice rilevante:Perché navigationItem.titleView è allineato a sinistra quando viene visualizzato presentmodalviewcontroller?

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Title view label 
    CGRect labelFrame = CGRectMake(0.0, 0.0, 120.0, 36.0); 
    UILabel *label = [[[UILabel alloc] initWithFrame:labelFrame] autorelease]; 
    label.font = [UIFont boldSystemFontOfSize:14]; 
    label.numberOfLines = 2; 
    label.backgroundColor = [UIColor clearColor]; 
    label.textAlignment = UITextAlignmentCenter; 
    label.textColor = [UIColor whiteColor]; 
    label.shadowColor = [UIColor blackColor]; 
    label.shadowOffset = CGSizeMake(0.0, -1.0); 
    label.lineBreakMode = UILineBreakModeMiddleTruncation; 
    self.navigationItem.titleView = label; 
} 

-(void)displayComposerSheet:(NSString*)mailto 
{ 
    MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; 
    picker.mailComposeDelegate = self; 
    [self presentModalViewController:picker animated:YES]; 
    [picker release]; 
} 

Screenshots: enter image description here

Qualsiasi idea del perché questo sta accadendo? Grazie.

risposta

3

Grazie a DougW per avermi indicato nella giusta direzione. Ecco il miglior trucco che ho trovato. Fondamentalmente ritengo UILabel come una proprietà di classe. Prima di presentare la vista modale, disattivo il titleView, quindi lo ripristino immediatamente dopo. Quando la vista modale viene chiusa, disattivo, quindi reimposta il titleView. Per l'utente nessuno di questi è visibilmente notevole.

-(void)displayComposerSheet:(NSString*)mailto 
{ 
    self.navigationItem.titleView = nil; 
    MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; 
    picker.mailComposeDelegate = self; 
    picker.navigationBar.tintColor = [APPDELEGATE getNavTintColor]; 
    [picker setToRecipients:[NSArray arrayWithObject:mailto]]; 
    [self presentModalViewController:picker animated:YES]; 
    [picker release]; 
    self.navigationItem.titleView = titlelabel; 
} 

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error 
{ 
    self.navigationItem.titleView = nil; 
    self.navigationItem.titleView = titlelabel; 
    [self dismissModalViewControllerAnimated:YES]; 
} 
+0

In - (void) loadView Ho aggiunto self.label = [[UILabel alloc] initWithFrame: self.navigationController.navigationBar.frame]; self.navigationItem.titleView = self.label; e poi ha cambiato solo il testo di self.label – blyabtroi

1

Ha animare? Potrebbe essere l'animazione della vista titolo come se stesse passando a una nuova vista. Non vedo nulla di sbagliato nel tuo codice come scritto.

vorrei suggerire in displayComposerSheet, è sufficiente disinserire il titleView, o animare l'alfa del titleView a 0,0. Quindi, animalo di nuovo a 1.0 quando si elimina il controller di visualizzazione modale. Non ideale, ma potrebbe sembrare migliore in questo modo.

Francamente, l'intero sistema UINavigation è una schifezza. Siamo andati avanti e l'abbiamo riscritto a causa di problemi bizzarri come questi.

+0

Sì, la vista modale è animata (la seconda schermata mostra la presentazione della vista modale in corso). Il problema è che il titleview rimane allineato a sinistra anche dopo che la vista modale è stata chiusa. –

+0

Grazie per il suggerimento. Ho provato alcune varianti e ho trovato un trucco che "risolve" il problema. Il codice è nella mia risposta. Ti svaluterei ma non ho abbastanza reputazione. –

+0

Contento di aver potuto aiutare. Sì, la roba Uinav è un boondoggle serio. È un peccato che dobbiamo ricorrere a correzioni hacky come quella. – DougW

1

L'unico problema è la dimensione del telaio. quindi devi cambiarlo.

Prova questo.

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 36.0)]; 

    label.font = [UIFont boldSystemFontOfSize:14]; 
    label.numberOfLines = 2; 
    label.backgroundColor = [UIColor clearColor]; 
    label.textAlignment = UITextAlignmentCenter; 
    label.textColor = [UIColor whiteColor]; 
    label.shadowColor = [UIColor blackColor]; 
    label.shadowOffset = CGSizeMake(0.0, -1.0); 
    label.lineBreakMode = UILineBreakModeMiddleTruncation; 
    [email protected]"Stack Overflow"; 
    self.navigationItem.titleView = label; 
+0

Hmm. Così ho provato a cambiare la larghezza a 320, ma succede la stessa cosa. Sembra ignorare il frame di UILabel - invece ha lasciato allineato il testo nell'etichetta sul lato sinistro dello schermo: -/ –

10

ho guardato dentro il problema con qualche colpo e provare e abbiamo trovato i seguenti fatti:

  • Se l'UINavigationBar non ha la rightBarButtonItem, il titleView sposta verso destra dalla ~ 30pts.
  • Potrebbe essere riprodotta per leftBarButtonItem. Ma non ho provato

In uno scenario in cui è impostata l'opzione predefinita UINavigationBar (senza modifiche ai valori predefiniti di rightBarButtonItem). E poi un nuovo UIView viene inviato allo stack di navigazione che HA un rightBarButtonItem. Ora, se questa vista è spuntata [con il pulsante Indietro], la barra di navigazione rimuoverà il RightBarButtonItem. E questo rappresenterà lo strano offset che sposta il titleView verso un lato.

Come ho risolto il problema era come questo:

self.navigationItem.titleView = myCustomTitleView; 

// Fake right button to align titleView properly. 
UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:[[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 1)]]; 
// Width equivalent to system default Done button's (which appears on pushed view in my case). 
rightBarButtonItem.enabled = NO; 
self.navigationItem.rightBarButtonItem = rightBarButtonItem; 

Tutto è dolce ora. yummmm.

+0

questo ha funzionato per me. Grazie. – mtb

-1
UIView *view= [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)]; 
    [view setUserInteractionEnabled:NO]; 
    view.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"logo_small.png"]]; 
    UIBarButtonItem *barButton=[[UIBarButtonItem alloc]initWithCustomView:view ]; 
    self.navigationItem.leftBarButtonItem = barButton; 
0

Si può provare a spostare il codice in viewDidAppear:

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    // You code to customize title view 
    self.navigationItem.titleView = logoImage; 
} 

Funziona per me.

Problemi correlati