Cómo animar la vista del encabezado UITableView

Necesito animar la inserción de una vista de encabezado de vista de tabla. Quiero que las filas de la tabla se deslicen hacia abajo mientras la vista del encabezado expande su marco.
Hasta ahora, el mejor resultado que obtuve es usando el siguiente código:

[self.tableView beginUpdates]; [self.tableView setTableHeaderView:self.someHeaderView]; [self.tableView endUpdates]; 

El problema con esta solución es que el encabezado en sí no se anima, su marco no se expande.

Entonces, el efecto que obtengo es que las filas de la tabla se deslizan hacia abajo (como quiero), pero la vista del encabezado se muestra inmediatamente, y quiero que amplíe su marco con animation.

¿Algunas ideas?

Gracias.

tener el marco del encabezado en CGRectZero y establecer su marco usando la animation

 [self.tableView beginUpdates]; [self.tableView setTableHeaderView:self.someHeaderView]; [UIView animateWithDuration:.5f animations:^{ CGRect theFrame = someBigger.frame; someHeaderView.frame = theFrame; }]; [self.tableView endUpdates]; 

Esto es lo que pude trabajar en Swift, con una altura inicial de cero y actualizarla a toda su altura en el cierre de animaciones:

 // Calculate new frame size for the table header var newRect = tableView.tableHeaderView?.frame newRect?.size.height = 42 // Get the reference to the header view let tblHeaderView = self.tableView.tableHeaderView // Animate the height change UIView.animateWithDuration(0.6, animations: { () -> Void in tblHeaderView?.frame = newRect! self.tableView.tableHeaderView = tblHeaderView }) 

La respuesta seleccionada no funcionó para mí. Tuve que hacer lo siguiente:

 [UIView animateWithDuration: 0.5f animations: ^{ CGRect frame = self.tableView.tableHeaderView.frame; frame.size.height = self.headerViewController.prefernetworkingHeight; self.tableView.tableHeaderView.frame = frame; self.tableView.tableHeaderView = self.tableView.tableHeaderView; }]; 

La parte realmente peculiar es que esto funciona en una vista, pero no en una subclass de la misma jerarquía de controller / vista.

¡Encontré la forma definitiva y adecuada de lograr una animation real en tableHeaderView s!

• Primero, si está en Autolayout , mantenga el sistema Margin dentro de la vista del encabezado. Con Xcode 8 ahora es posible (¡por fin!), Simplemente no establezca ninguna restricción a ninguna de las sub-vistas del encabezado. Tendrás que configurar los márgenes correctos pensados.

• Luego use beginUpdates y endUpdates , pero ponga endUpdate en el bloque de animation.

 // [self.tableView setTableHeaderView:headerView]; // not needed if already there [self.tableView beginUpdates]; CGRect headerFrame = self.tableView.tableHeaderView.bounds; headerFrame.size.height = PLAccountHeaderErrorHeight; [UIView animateWithDuration:0.2 animations:^{ self.tableView.tableHeaderView.bounds = headerFrame; [self.tableView endUpdates]; }]; 

Nota: solo lo intenté en iOS10, publicaré una actualización cuando se descargue mi simulador iOS9.

EDITAR

Desafortunadamente, no funciona tanto en iOS9 como en iOS10: el encabezado en sí no cambia su altura, pero las subvenciones del encabezado parecen moverse como si los límites del encabezado hubieran cambiado.

Use el siguiente código para que funcione

 extension UITableView { func hideTableHeaderView() -> Void { self.beginUpdates() UIView.animate(withDuration: 0.2, animations: { self.tableHeaderView = nil }) self.endUpdates() } func showTableHeaderView(header: UIView) -> Void { let headerView = header self.beginUpdates() let headerFrame = headerView.frame headerView.frame = CGRect() self.tableHeaderView = headerView UIView.animate(withDuration: 0.2, animations: { self.tableHeaderView?.frame = headerFrame self.tableHeaderView?.alpha = 0 self.endUpdates() }, completion: { (ok) in self.tableHeaderView?.alpha = 1 }) } }