Estoy insertando / eliminando la celda de la tabla usando insertRowsAtIndexPaths/deleteRowsAtIndexPathsenvuelto en beginUpdates/endUpdates. También lo estoy usando beginUpdates/endUpdatesal 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
CALayeranimaciones internamente. Es decir, añaden las animaciones a cualquier openCATransaction. Si noCATransactionexiste 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
completionBlockantesbeginUpdatesy el meendUpdatesgusta 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
endUpdatesy 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
endUpdatesse llame, también se podría sobrescribirendUpdatesy 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
scrollViewDidEndScrollingAnimationsolo se llama en respuesta asetContentOffsetyscrollRectToVisiblePuedes 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
UITableViewyUIScrollViewdelegate 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
willDisplayCellque 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.