2010-08-21 27 views
12

En mi aplicación, obtuve un UINavigationController. Lamentablemente, cuando giro el dispositivo y la orientación de la interfaz cambia, UINavigationBar no cambia su altura. En otras aplicaciones de iPhone, como Contacts.app, la barra de navegación se pone un poco menos alta en el modo horizontal. Debe estar incorporado, porque si toma la aplicación de muestra de navegación del menú XCode y le agrega la orientación de la interfaz, cambia la altura de la barra de navegación correctamente.UINavigationBar reajustando

¿Cómo puedo hacer que la barra de navegación cambie de tamaño como lo hace en todas las demás aplicaciones de iPhone que he visto?

Respuesta

19

He hecho un poco de pruebas, y aunque no me gusta el método, es bastante fácil de hacer.

Después de haber buscado un método privado que puede haber funcionado, no pude encontrar uno. Todo lo que encontré fue:

@property BOOL forceFullHeightInLandscape; 

- (BOOL)isMinibar; 

No hay colocador de -isMinibar, por lo que no se puede establecer que. Supongo que devuelve un valor basado en su altura. Además, forceFullHeightInLandscape se estableció en NO, sin embargo, todavía no ajustaba su altura.

mientras se cambia el autoresizingMask incluir UIViewAutoresizingFlexibleHeight, la vista hizo cambio de tamaño para ser más pequeño, pero ahora era demasiado pequeño. Sin embargo, -isMinibar de repente devolvió YES. Eso me hizo pensar en solo dejar que la vista cambie de tamaño, ajustándola a la altura correcta.

Así que vamos, un método que funciona, incluso sin llamadas a la API privadas:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    [self.navigationBar performSelector:@selector(sizeToFit) withObject:nil afterDelay:(0.5f * duration)]; 
} 

Una cosa que usted tiene que hacer frente es que los puntos de vista debajo de la barra no conseguirán ajustado a la barra más pequeña, de modo que haya un espacio entre la barra y las vistas a continuación. La forma más sencilla de resolver esto es agregar una vista de contenedor, como en el caso de UINavigationController. Se podría llegar a algo como:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    [self performSelector:@selector(resizeViewsForNavigationBar) withObject:nil afterDelay:(0.5f * duration)]; 
} 

- (void)resizeViewsForNavigationBar { 
    [self.navigationBar sizeToFit]; 

    // Resize containerView accordingly. 
    CGRect containerViewRect = self.containerView.frame; 
    containerViewRect.origin.y = CGRectGetMaxY(self.navigationBar.frame); 
    containerViewRect.size.height = CGRectGetMaxY(self.view.frame) - containerViewRect.origin.y; 
    self.containerView.frame = containerViewRect; 
} 
+0

+1 para una respuesta excelente – vodkhang

+0

Gracias por la respuesta, no puedo probarlo ahora pero lo informaré una vez que lo intenté. Curiosamente, la vista del contenedor ya se ha redimensionado correctamente, como si la barra de navegación se hubiera acortado como debería. – ryyst

+0

¡Lo probé hace un momento y funciona perfectamente! Dado que la vista de contenedor ya cambia el tamaño correctamente, solo necesito la llamada 'sizeToFit'. – ryyst

0

Creo que éste es un poco similar a usted y tienen el fragmento de código:

iPhone: UINavigationBar with buttons - adjust the height

+0

¿Seguro la altura barra de navegación de reducción no está incorporado en somehwere? – ryyst

+0

Debe estar incorporado, porque si saca la aplicación de muestra de navegación del menú XCode y le agrega la orientación de la interfaz, cambia la altura de la barra de navegación correctamente. – ryyst

2

Creo que el comportamiento solo deseas sucede cuando se agrega un controlador de navegación (que representa las barras de navegación (o la barra de herramientas)), a la ventana de la aplicación o delegado presentado por una barra de pestañas, etc.

Puede agregar una barra de navegación a través de IB o código, esto no significa que tiene un controlador de navegación. Mi opinión es, crea un controlador de navegación e inicialízalo con el controlador de vista en el que estás trabajando. Probablemente cuando la vista gire, la barra de navegación se encogerá un poco, de la manera que te guste.

Esperanza esto ayuda

+0

Eso es exactamente lo que hice y no, no funciona. ¡Gracias por la respuesta! – ryyst

0

simplemente he intentado un par de cosas sólo dentro de Interface Builder y Xcode y el tiempo que se utiliza el UINavigationBarController como RootViewController funciona como se describe - cada vez más pequeño. ¿Cambió algo dentro del Controlador o en partes de cómo se carga el Controlador? Especialmente con respecto al disparo de eventos? Tuve algunos malos resultados con el UITabBarController en términos de romper el mensaje correcto y obtuve algunos efectos secundarios de la vista 'interessting'. Solo un intento y una suposición.

+0

Bueno, de hecho estoy usando un UITabBarController también. Aparte de eso, estoy creando todo con código, sin Interface Builder. – ryyst

+0

Ah, vale, al ver que ya se ha respondido, tengo curiosidad por saber si solo utilizas un UITabBar programáticamente. ¿Todavía no está funcionando? Supongo que todo está contenido dentro del RootViewController. Tal vez no es realmente un error, pero no funciona correctamente con dos controladores. Si intentas hacerlo con el Interface Builder, no funcionará de todos modos, ya que no permite mezclar un NavigationBarController con un UITabBarController. – mic

1

Acabo de tener este error también, y aunque probablemente no sea por la misma razón, me gustaría publicarlo aquí para ayudar a los demás.

Si está anulando cualquier willRotateToInterface métodos, recuerde llamar super

me blanqueó en eso, pero una vez que vi la respuesta aceptada que vino a mí.

2

Gracias a Joost He agregado

@property BOOL forceFullHeightInLandscape; 

a mi clase UINavigationBar personalizado. Y establecer en:

-(id)initWithFrame:(CGRect)frame{ 
forceFullHeightInLandscape = YES; 

funcionó como un encanto

+0

También puede anular esto en una categoría UINavigationBar: '- (BOOL) forceFullHeightInLandscape { return YES; } ' –

2

Similar a la respuesta de Joost, pero poner el método en willAnimateRotationToInterfaceOrientation tiene un mejor efecto de animación que willRotateToInterfaceOrientation. (No hay ningún retraso animación)

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    [self.navigationBar sizeToFit]; 
} 
-1
(void)viewWillLayoutSubviews { 
     self.navigationItem.titleView.bounds = self.navigationController.navigationBar.bounds; 
}