¿Por qué navigationItem.titleView se alinea a la izquierda cuando se llama a presentmodalviewcontroller?

Estoy usando una UILabel para el títuloView de una barra de navigation (estoy haciendo un browser web simple en la aplicación). Funciona bien, excepto que cuando presento un controller de vista modal, titleView cambia del centro de la barra de navigation al extremo izquierdo (debajo del button de retroceso). He probado en 3.0 o más. Aquí hay un código relevante:

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

Capturas de pantalla: introduzca la descripción de la imagen aquí

¿Alguna idea de por qué sucede esto? Gracias.

Miré el problema con un golpe y probé y encontré los siguientes hechos:

  • Si UINavigationBar no tiene el RightBarButtonItem, el títuloView se desplaza hacia la derecha en ~ 30pts.
  • Podría reproducirse para leftBarButtonItem. Pero no lo he intentado.

En un escenario en el que se establece un valor pnetworkingeterminado de UINavigationBar (sin cambios en los valores pnetworkingeterminados rightBarButtonItem) titleView. Y luego una nueva UIView se empuja a la stack de navigation que tiene un rightBarButtonItem. Ahora, si esta vista aparece [con el button Atrás], la barra de navigation eliminará el object RightBarButton. Y esto representará el desplazamiento extraño que desplaza el títuloView hacia un lado.

Cómo solucioné el problema fue así:

 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; 

Todo es dulce ahora. yummmm

Gracias a DougW por señalarme en la dirección correcta. Aquí está el mejor truco que encontré. Básicamente conservo el UILabel como una propiedad de class. Antes de presentar la vista modal, desajuste el títuloView y luego lo restablece inmediatamente después. Cuando se desestima la vista modal, desactivo y luego restablece titleView. Para el usuario, nada de esto es visiblemente notable.

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

¿Anima? Puede estar animando la vista de título como si se tratara de una nueva vista. No veo nada malo con su código tal como está escrito.

Sugiero en su displayComposerSheet, simplemente descompone titleView, o anima el alfa de titleView a 0.0. Luego, animalo de nuevo a 1.0 cuando descartas el controller de vista modal. No es ideal, pero puede verse mejor de esa manera.

Francamente, todo el sistema de navigation UIN es basura. Seguimos adelante y lo networkingefinimos debido a problemas extraños como estos.

El único problema es tu tamaño de marco. así que tienes que cambiarlo.

Prueba esta.

  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; label.text=@"Stack Overflow"; self.navigationItem.titleView = label; 

Puede intentar mover el código en viewDidAppear :

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

Esto funciona para mi.

  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;