Estoy insertando / eliminando la celda de la tabla usando insertRowsAtIndexPaths/deleteRowsAtIndexPaths
envuelto en beginUpdates/endUpdates
. También lo estoy usando beginUpdates/endUpdates
al ajustar rowHeight. Todas estas operaciones están animadas por defecto.
¿Cómo puedo detectar que la animación ha terminado cuando se usa beginUpdates/endUpdates
?
iphone
objective-c
ios
ipad
pixelfreak
fuente
fuente
-scrollToRowAtIndexPath:atScrollPosition:animated:
.Respuestas:
¿Qué pasa con esto?
Esto funciona porque las animaciones de tableView usan
CALayer
animaciones internamente. Es decir, añaden las animaciones a cualquier openCATransaction
. Si noCATransaction
existe ninguna apertura (el caso normal), entonces se inicia implícitamente una, que finaliza al final del ciclo de ejecución actual. Pero si comienza uno usted mismo, como se hace aquí, entonces usará ese.fuente
completionBlock
antesbeginUpdates
y el meendUpdates
gusta en el fragmento?[CATransaction commit]
debe llamarse después, no antes[tableView endUpdates]
.Versión rápida
fuente
Si tiene como objetivo iOS 11 y superior, debería usar
UITableView.performBatchUpdates(_:completion:)
en su lugar:fuente
Una posible solución podría ser heredar del UITableView en el que llama
endUpdates
y sobrescribirlosetContentSizeMethod
, ya que UITableView ajusta el tamaño de su contenido para que coincida con las filas agregadas o eliminadas. Este enfoque también debería funcionarreloadData
.Para asegurarse de que una notificación se envíe solo después de que
endUpdates
se llame, también se podría sobrescribirendUpdates
y establecer una bandera allí.fuente
Puede incluir su (s) operación (es) en el bloque de animación UIView así:
Créditos a https://stackoverflow.com/a/12905114/634940 .
fuente
endUpdates
, pero antes de que se completaran las animaciones.Todavía no he encontrado una buena solución (salvo subclasificar UITableView). Decidí usarlo
performSelector:withObject:afterDelay:
por ahora. No es ideal, pero hace el trabajo.ACTUALIZACIÓN : Parece que puedo usarlo
scrollViewDidEndScrollingAnimation:
para este propósito (esto es específico para mi implementación, ver comentario).fuente
scrollViewDidEndScrollingAnimation
solo se llama en respuesta asetContentOffset
yscrollRectToVisible
Puedes usar
tableView:willDisplayCell:forRowAtIndexPath:
como:Pero esto también se llamará cuando una celda que ya está en la tabla se mueva de fuera de la pantalla a la pantalla, por lo que puede que no sea exactamente lo que está buscando. Acabo de revisar todos los métodos
UITableView
yUIScrollView
delegate y no parece haber nada que manejar justo después de que se inserta la animación de una celda.¿Por qué no simplemente llamar al método que desea que se llame cuando la animación finalice después de
endUpdates
?fuente
willDisplayCell
que funcione. Necesito que suceda después de la animación porque necesito hacer una actualización visual solo después de que todo se resuelva.