example bar uitableview uinavigationcontroller rotation bounds

example - UITableView en UINavigationController se coloca debajo de la barra de navegación después de la rotación



root view controller navigation controller (8)

Parece que la vista de tabla se desplaza hacia abajo un poco después de que cambie la orientación.

¿Has intentado llamar a scrollToRowAtIndexPath:atScrollPosition:animated: y desplazándote a la fila más alta?

Este es el retrato:

texto alternativo http://i45.tinypic.com/2cp6ttf.jpg

Esto es Paisaje

texto alternativo http://i47.tinypic.com/15g6ve9.jpg

Lo intenté en la rotación sin éxito:

self.tableView.autoresizesSubviews = YES; self.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;


Este problema puede ocurrir si ha llamado "willAnimateRotationToInterfaceOrientation:" en su controlador de navegación, pero olvidó llamar a super desde dentro del método.

Deberías tener algo como esto:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation]; // Your code here }


Una cosa a tener en cuenta en estas situaciones es la orientación de la barra de estado si la está cambiando manualmente. Si la barra de estado no está oculta y cambias el marco de tu vista mientras la barra de estado está en la orientación incorrecta (en tu código, tal vez estás actualizando la orientación de la barra de estado justo después del cambio de marco), será automático cambie el tamaño de la barra de navegación de manera incorrecta, incluso si no ha activado el cambio de tamaño automático.


Me encontré con este problema recientemente. En mi caso, fue porque estaba realizando rotaciones de un controlador de navegación que no era el controlador raíz de la ventana de la aplicación. Por lo tanto, estaba usando el enfoque rotar notificación de escucha / transformación afín / ajuste de límites para cambiar el diseño del controlador de navegación. Esto funcionó bien, pero produjo los resultados que se describen aquí. Me tomó un tiempo darme cuenta de que cuando giré al paisaje, la altura de la barra de navegación no se cambiaba correctamente (es decir, de 44 a 32 píxeles, la altura reducida del marco para el modo horizontal). Sin embargo, el controlador de vista raíz de mi aplicación respondía a willRotateToInterfaceOrientation y didRotateFromInterfaceOrientation . Ese controlador de vista también ya sabía sobre el controlador de navegación asociado. Remedié el problema añadiendo el siguiente código al método willRotateToInterfaceOrientation :

CGRect frame = self.navViewController.navigationBar.frame; if (toInterfaceOrientation == UIInterfaceOrientationPortrait || toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { frame.size.height = 44; } else { frame.size.height = 32; } self.navViewController.navigationBar.frame = frame;

Espero que esto ahorre algo a alguien en una situación similar.


Cuando se utiliza un controlador de vista personalizado como raíz, que administra otros controladores de vista, entonces es responsable de reenviar todos los eventos de rotación al subcontrolador actualmente activo (si puedo llamarlo así). Estos eventos son:

– willRotateToInterfaceOrientation:duration: – willAnimateRotationToInterfaceOrientation:duration: – didRotateFromInterfaceOrientation: – willAnimateFirstHalfOfRotationToInterfaceOrientation:duration: – didAnimateFirstHalfOfRotationToInterfaceOrientation: – willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:

Por lo tanto, en el caso de un controlador de navegación administrado por su controlador raíz personalizado, reenvío – willAnimateRotationToInterfaceOrientation:duration: al controlador de navegación soluciona el problema con la altura incorrecta de la barra de navegación al girar.


Tengo exactamente el mismo problema, y ​​@jstevenco me llevó a una solución realmente extraña. Mis vistas también cambian de tamaño automáticamente al girar, pero la vista de tabla no parece entender que haya un controlador de navegación ahí:

En TableViewcontroller, agregue lo siguiente:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { [super didRotateFromInterfaceOrientation:fromInterfaceOrientation]; CGRect frame = navBar.frame; if (fromInterfaceOrientation == UIInterfaceOrientationPortrait || fromInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { frame.size.height = 31.9; } else { frame.size.height = 44.1; } navBar.frame = frame; }

¡El 31.9 y el 44.1 son muy importantes! Dejando estos son 32 y 44, no hay cambio de tamaño para hacer, por lo que parece ignorarlo. Funcionó para mí, espero que ayude a alguien más.


Agregue la siguiente línea en el método didRotateFromInterfaceOrientation.

[self.navigationController.view layoutSubviews];

Espero que esto sea así.


Su UINavigationController necesita ser notificado cuando cambia la orientación del dispositivo. Esto no ocurre si solo agrega la view de un UINavigationController a otra UIView .

A partir de iOS 5, simplemente puede llamar a addChildViewController: en el UIViewController padre, lo que garantizará que los cambios de orientación se propaguen a este controlador de vista secundaria.