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;
}
+1 para una respuesta excelente – vodkhang
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
¡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