2010-06-03 10 views
6

Estoy usando un UILabel para el título Vista de una barra de navegación (estoy haciendo un simple navegador web en la aplicación). Funciona bien, excepto que cuando presento un controlador de vista modal, el titleView se desplaza desde el centro de la barra de navegación a la extrema izquierda (debajo del botón de retroceso). He probado en 3.0 y más. Aquí está el código correspondiente:¿Por qué navigationItem.titleView se alinea a la izquierda cuando se llama a showmodalviewcontroller?

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

Imágenes: enter image description here

Alguna idea de por qué ocurre esto? Gracias.

Respuesta

3

Gracias a DougW por orientarme en la dirección correcta. Este es el mejor truco que encontré. Básicamente retengo el UILabel como una propiedad de clase. Antes de presentar la vista modal, desactivé TitleView y luego lo reinicié inmediatamente después. Cuando se cierra la vista modal, desactivo y reinicio la vista de título. 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]; 
} 
+0

En (vacío) loadView He agregado self.label = [[UILabel alloc] initWithFrame: self.navigationController.navigationBar.frame]; self.navigationItem.titleView = self.label; y luego solo cambié el texto de self.label – blyabtroi

1

¿Es animado? Puede estar animando la vista de título como si estuviera en transición a una nueva vista. No veo nada mal con su código como está escrito.

Yo sugeriría en su displayComposerSheet, que acaba de desactivar el titleView, o animar el alpha del titleView a 0.0. Luego, vuélvalo a animar a 1.0 cuando descarta el controlador de vista modal. No es ideal, pero puede verse mejor de esa manera.

Francamente, todo el sistema de navegación de UIN es una porquería. Seguimos adelante y lo reescribimos por problemas extraños como estos.

+0

Sí, la vista modal está animada (la segunda captura de pantalla muestra la presentación de la vista modal en progreso). El problema es que la vista de título permanece alineada a la izquierda incluso después de descartar la vista modal. –

+0

Gracias por la sugerencia. Intenté algunas variaciones y encontré un truco que "resuelve" el problema. El código está en mi respuesta. Te hubiera votado pero no tengo suficiente reputación. –

+0

Me alegro de poder ayudar. Sí, las cosas de UINav son un embrollo serio. Es una pena que tengamos que recurrir a soluciones hacky como esa. – DougW

1

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

Pruebe este.

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. Así que intenté cambiar el ancho a 320, pero sucede lo mismo. Parece ignorar el marco de UILabel, en su lugar, alinea el texto de la etiqueta con el borde izquierdo de la pantalla: -/ –

10

miré en el problema con algún golpe y tratar de conocer los siguientes hechos:

  • Si el UINavigationBar no tiene la rightBarButtonItem, la titleview desplaza hacia la derecha por ~ 30pts.
  • Se puede reproducir para leftBarButtonItem. Pero no lo he intentado.

En un escenario en el que se establece la UINavigationBar predeterminada (sin cambios en los valores predeterminados deBarButtonItem derecho) titleView. Y luego, un nuevo UIView se empuja a la pila de navegación que TIENE un RightBarButtonItem. Ahora, si esta vista aparece [con el botón Atrás], la barra de navegación eliminará elBarButtonItem correcto. Y esto explicará el desplazamiento extraño que desplaza el titleView hacia un lado.

Cómo me fijo 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.

+0

esto funcionó para mí. Gracias. – 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

Usted puede tratar de mover el código en viewDidAppear:

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

Funciona para mí.

Cuestiones relacionadas