2012-01-09 14 views
7

Estoy haciendo cambios en un tableView usando un bloque beginUpdates/endUpdates. A lo largo del camino, necesito actualizar una sombra paralela para que refleje la composición actual de tableView.UITableView beginUpdates/endUpdates callback

Intenté configurar KVO para tableView's contentSize pero solo se llama al endUpdates, una vez que la animación ha finalizado. Lo que quiero es que se llame cada vez que contentSize cambie (incluso si es solo por un píxel). ¿Hay alguna forma de lograr esto?

Respuesta

0

Lamento decirlo, no creo que puedas hacer esto. Cuando realiza cambios en la tabla después de haber llamado al beginUpdates, los cambios se animan como una animación única después de endUpdates. No hay devoluciones de llamadas de animación durante estas animaciones. No he probado esto, así que no sé si funcionaría bien para esto, pero podrías intentar anidar beginUpdates y endUpdates y actualizar tu sombra después de cada endUpdates.

+2

Para su información: Las invocaciones de beginUpdates y endUpdates se pueden anidar. Si no realiza las llamadas de inserción, eliminación y selección dentro de este bloque, los atributos de la tabla, como el recuento de filas, pueden dejar de ser válidos. –

+0

¿Tiene un ejemplo de cómo deben usarse las llamadas anidadas? – Rivera

24

¿Qué tal esto?

[CATransaction begin]; 

[CATransaction setCompletionBlock:^{ 
    // animation has finished 
}]; 

[tableView beginUpdates]; 
// do some work 
[tableView endUpdates]; 

[CATransaction commit]; 
+0

que lo hizo por mí! ¡Gracias! – horseshoe7

+1

¡guau! eso casi funciona pero hay una demora entre la vista de tabla que termina las actualizaciones y el bloque de finalización ejecutándose. Por ahora lo usaré. Gracias. – SpaceDog

1

El método de Rudolf no me funcionó tan bien como esperaba. En mi caso estaba seleccionando una fila en UITableView usando esto, y el método de Rudolf estaba causando que la tabla hiciera dos animaciones con un pequeño congelamiento: la animación dentro de beginUpdates/endUpdates, un poco de congelación y la animación en el bloque de finalización.

[tableView selectRowAtIndexPath:indexPath 
         animated:YES 
        scrollPosition:scrollPosition]; 

que me inspiró para crear este código ... y esto está funcionando sin problemas:

[UIView animateWithDuration:0.0 animations:^{ 
    [tableView beginUpdates]; 
    // do something to the table 
    [tableView endUpdates]; 
} completion:^(BOOL finished) { 
    // Code to run when table updates are complete. 
}];