Tengo un UITableView que tiene dos modos. Cuando cambiamos entre los modos, tengo un número diferente de secciones y celdas por sección. Idealmente, sería una animación genial cuando la tabla crezca o se reduzca.
Aquí está el código que probé, pero no hace nada:
CGContextRef context = UIGraphicsGetCurrentContext();
[UIView beginAnimations:nil context:context];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:0.5];
[self.tableView reloadData];
[UIView commitAnimations];
¿Alguna idea sobre cómo podría hacer esto?
cocoa-touch
animation
Vertexwahn
fuente
fuente
_tableView.reloadSections(NSIndexSet(index: 0), withRowAnimation: .Fade)
embargo, notablemente, solo actualiza la Sección 0, que es la primera sección predeterminada.Es posible que desee utilizar:
C objetivo
Rápido
Swift 3, 4 y 5
Sin problemas :RE
También puede usar cualquiera de los
UIViewAnimationOptionTransitions
que desee para obtener efectos más frescos:transitionNone
transitionFlipFromLeft
transitionFlipFromRight
transitionCurlUp
transitionCurlDown
transitionCrossDissolve
transitionFlipFromTop
transitionFlipFromBottom
fuente
[_tableView reloadSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, sectionCount)] withRowAnimation:UITableViewRowAnimationFade];
Tener más libertad usando la
CATransition
clase.No se limita a la decoloración, sino que también puede hacer movimientos.
Por ejemplo:
(no olvides importar
QuartzCore
)Cambie el
type
para que coincida con sus necesidades, comokCATransitionFade
etc.Implementación en Swift:
Referencia para CATransition
Swift 5:
fuente
layer
propiedad de aUITableViewCell
.Creo que puede actualizar su estructura de datos y luego:
Además, el "withRowAnimation" no es exactamente un estilo booleano, sino un estilo de animación:
fuente
Todas estas respuestas suponen que está utilizando un UITableView con solo 1 sección.
Para manejar con precisión situaciones en las que tiene más de 1 sección, use:
(Nota: ¡debes asegurarte de tener más de 0 secciones!)
Otra cosa a tener en cuenta es que puede encontrarse con una excepción NSInternalInconsistencyException si intenta actualizar simultáneamente su fuente de datos con este código. Si este es el caso, puede usar una lógica similar a esta:
fuente
La forma de abordar esto es decirle a tableView que elimine y agregue filas y secciones con el
insertRowsAtIndexPaths:withRowAnimation:
`deleteRowsAtIndexPaths:withRowAnimation:
`insertSections:withRowAnimation:
ydeleteSections:withRowAnimation:
métodos de UITableView.
Cuando llame a estos métodos, la tabla animará los elementos que solicitó, luego llamará a reloadData sobre sí mismo para que pueda actualizar el estado después de esta animación. Esta parte es importante: si anima todo pero no cambia los datos devueltos por la fuente de datos de la tabla, las filas aparecerán nuevamente una vez que se complete la animación.
Entonces, el flujo de su aplicación sería:
[self setTableIsInSecondState:YES];
[myTable deleteSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:YES]];
Mientras los métodos dataSource de su tabla devuelvan el nuevo conjunto correcto de secciones y filas marcando
[self tableIsInSecondState]
(o lo que sea), esto logrará el efecto que está buscando.fuente
No puedo comentar sobre la respuesta principal, pero una implementación rápida sería:
puede incluir tantas secciones como desee actualizar en el primer argumento para reloadSections.
Otras animaciones disponibles en los documentos: https://developer.apple.com/reference/uikit/uitableviewrowanimation
fundido La fila o filas insertadas o eliminadas se desvanecen dentro o fuera de la vista de tabla.
right La fila o filas insertadas se deslizan desde la derecha; la fila o filas eliminadas se deslizan hacia la derecha.
left La fila o filas insertadas se deslizan desde la izquierda; la fila o filas eliminadas se deslizan hacia la izquierda.
arriba La fila o filas insertadas se deslizan desde la parte superior; la fila o filas eliminadas se deslizan hacia la parte superior.
parte inferior La fila o filas insertadas se deslizan desde la parte inferior; la fila o filas eliminadas se deslizan hacia la parte inferior.
caso ninguno Las filas insertadas o eliminadas utilizan las animaciones predeterminadas.
middle La vista de tabla intenta mantener las celdas antiguas y nuevas centradas en el espacio que ocuparon o ocuparán. Disponible en iPhone 3.2.
automático La vista de tabla elige un estilo de animación apropiado para usted. (Introducido en iOS 5.0.)
fuente
Swift 4 versión para @dmarnel respuesta:
fuente
Implementación rápida:
fuente
Para Swift 4
fuente
En mi caso, quería agregar 10 filas más en la vista de tabla (para un tipo de funcionalidad "mostrar más resultados") e hice lo siguiente:
En la mayoría de los casos, en lugar de "self.numberOfRows", generalmente usaría el recuento de la matriz de objetos para la vista de tabla. Por lo tanto, para asegurarse de que esta solución funcione bien para usted, "arrayOfIndexPaths" debe ser una matriz precisa de las rutas de índice de las filas que se insertan. Si la fila existe para cualquiera de estas rutas de índice, el código puede bloquearse, por lo que debe usar el método "reloadRowsAtIndexPaths: withRowAnimation:" para esas rutas de índice para evitar bloquearse
fuente
Si desea agregar sus propias animaciones personalizadas a las celdas UITableView, use
para obtener una matriz de celdas visibles. Luego agregue cualquier animación personalizada a cada celda.
Echa un vistazo a esta esencia que publiqué para obtener una animación de celda personalizada suave. https://gist.github.com/floprr/1b7a58e4a18449d962bd
fuente
La animación sin reloadData () en Swift se puede hacer así (a partir de la versión 2.2):
en caso de que necesite llamar a reloadData () después de que finalice la animación, puede aceptar los cambios en CATransaction de esta manera:
La lógica se muestra para el caso cuando elimina filas, pero la misma idea también funciona para agregar filas. También puede cambiar la animación a UITableViewRowAnimation.Left para que quede ordenada o elegir de la lista de otras animaciones disponibles.
fuente
fuente
.3
dos veces?Para recargar todas las secciones , no solo una con duración personalizada .
duration
Parámetro de usuarioUIView.animate
para establecer la duración personalizada.fuente
UITableView
Animaciones nativas en SwiftInserte y elimine filas todas a la vez con
tableView.performBatchUpdates
para que ocurran simultáneamente. Partiendo de la respuesta de @iKenndac, utilice métodos como:tableView.insertSections
tableView.insertRows
tableView.deleteSections
tableView.deleteRows
Ex:
Esto inserta una sección en la posición cero con una animación que se carga desde la parte superior. Esto volverá a ejecutar el
cellForRowAt
método y buscará una nueva celda en esa posición. Puede volver a cargar toda la vista de la tabla de esta manera con animaciones específicas.Re: la pregunta OP, se habría necesitado un indicador condicional para mostrar las celdas para el estado de vista de tabla alternativa.
fuente