Pregunta

En mi aplicación, tengo una UINavigationController. Por desgracia, cuando gira el dispositivo y los cambios de orientación interfaz, el UINavigationBar no cambia su altura. En otras aplicaciones para el iPhone, como el Contacts.app, la barra de navegación se pone un poco menos de altura en modo horizontal. Debe ser incorporado, ya que si se toma la aplicación de ejemplo de navegación en el menú XCode y añadir la orientación interfaz a ella, sí cambia la altura de la barra de navegación correctamente.

¿Cómo puedo hacer que el cambio de tamaño barra de navegación como lo hace en el resto de aplicaciones de iPhone que he visto?

¿Fue útil?

Solución

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 pueden haber trabajado, no pude encontrar uno. Todo lo que encontramos fue:

@property BOOL forceFullHeightInLandscape;

- (BOOL)isMinibar;

No hay colocador de -isMinibar, así que no podemos establecer que. Supongo que devuelve un valor en función de su altura. Además, se establece en forceFullHeightInLandscape NO, sin embargo, todavía no se ajustó su altura.

Si bien el cambio de la autoresizingMask para incluir UIViewAutoresizingFlexibleHeight, la vista hicieron cambio de tamaño para ser más pequeño, pero ahora era demasiado pequeño. Sin embargo, pronto regresó -isMinibar YES. Por lo que me hizo pensar de limitarse a dejar que la vista de cambio de tamaño en sí, ajustándolo a la altura correcta.

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

- (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 se ajustarán a la barra más pequeña, por lo que habrá una brecha entre la barra y los puntos de vista de abajo. La manera más fácil de resolver esto es agregar una vista de contenedor, al igual que el caso con un 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;
}

Otros consejos

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 en el delegado de la aplicación o presentado por una barra de pestañas, etc.

Se puede añadir una barra de navegación a través del IB o código, esto no significa que usted tiene un mando de navegación. Mi opinión es, crear un controlador de navegación e inicializar con el controlador de vista que se está trabajando. Probablemente cuando la vista gira, la barra de navegación se reducirá un poco, la forma en que te gusta.

Espero que esto ayude

Gracias a Joost me han añadido

@property BOOL forceFullHeightInLandscape;

a mi clase UINavigationBar personalizado. Y establecer en:

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

Trabajó como un encanto

Al igual que en 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];
}

Sólo tuve este error, así, y aunque no es probable que por la misma razón que me gustaría publicar aquí para ayudar a cualquier otra cosa que pifias.

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

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

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

iPhone: UINavigationBar con los botones - ajustar la altura

Me acaba de intentar algunas 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ó alguna cosa dentro del propio controlador o en partes de la forma en que el controlador está cargado? Especialmente en relación con el disparo de eventos? He tenido algunos malos expiriences con el UITabBarController en términos de romper la mensajería adecuada y tengo algunos efectos secundarios '' interessting vista. Sólo una oportunidad y una conjetura.

(void)viewWillLayoutSubviews {
      self.navigationItem.titleView.bounds = self.navigationController.navigationBar.bounds;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top