UITableView y UITableViewHeader en conflicto después de rotar y cambiar el tamaño

Tengo una vista de tabla con un encabezado de vista de tabla (no encabezado de sección) que cambian de tamaño dependiendo de la orientación. En mi implementación, estoy configurando los frameworks para ambas vistas en viewWillLayoutSubviews.

Mi problema en este momento es que, aunque ambos cambian de tamaño de manera individual después de rotar, el origen de tableView no cambia para tener en count el cambio de altura del encabezado. Esto está llevando a un espacio que aparece entre ellos o al encabezado que cubre algunas de las celdas.

Mi objective es tener en retrato, la vista de tabla sea de ancho de pantalla con un encabezado largo. Cuando se gira al paisaje, el ancho disminuye a un tercio del ancho de la pantalla, justificado a la derecha, con un encabezado más corto. Además, necesito la animation de rotation para que todos estos cambios sean fluidos y lógicos.

Estoy bastante ecológico con las prácticas de rotation y animation de iOS, así que si alguien tiene mejores sugerencias, definitivamente las apreciaría.

La vista de tabla no respetará la altura del encabezado nuevo hasta que reasigne tableHeader.

Preguntas similares:

  • ¿Cómo establecer la altura del encabezado de la tabla en UITableView?

  • ¿Cómo cambiar el tamaño de una tablaHeaderView de una UITableView?

Cuando finalice la rotation, puede hacer lo siguiente:

- (void)didRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { self.tableView.tableHeaderView = self.tableView.tableHeaderView; } 

De hecho, este es también el lugar donde se puede calcular la altura del encabezado:

 - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { CGRect frame = self.tableView.tableHeaderView.frame; frame.size.height = UIInterfaceOrientationIsLandscape(toInterfaceOrientation) ? 50 : 150; self.tableView.tableHeaderView.frame = frame; self.tableView.tableHeaderView = self.tableView.tableHeaderView; } 

En iOS 8.0 o más puede llamar:

 - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator; 

Si anula el método, asegúrese de llamar a super en algún momento.

  override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { coordinator.animate(alongsideTransition: { (UIViewControllerTransitionCoordinatorContext) in self.tableView.tableHeaderView? = YourTableHeaderView() }, completion: { (UIViewControllerTransitionCoordinatorContext) in }) super.viewWillTransition(to: size, with: coordinator) }