¿Cómo animar una transición UITableViewCell de abajo hacia arriba en Xamarin iOS nativo?

Hola a toda la comunidad de nativos de Xamarin iOS, estoy buscando una forma de animar un UITableViewCell en un UITableView, crear una transición de abajo hacia arriba con un efecto de desvanecimiento para cualquier celda.

enter image description here

Como todos los ejemplos que encuentro están en Swift, resuelvo esta respuesta por mi cuenta y compartiré la solución para la comunidad.

2
Marcos José Pérez Pérez 18 oct. 2017 a las 16:12

3 respuestas

La mejor respuesta

En la fuente de la tabla agregue el siguiente código

public override void WillDisplay(UITableView tableView,
UITableViewCell cell, NSIndexPath indexPath)
    {
            cell.Alpha = 0;

            var transform = CoreAnimation.CATransform3D.MakeTranslation(0, 100, 0);
            cell.Layer.Transform = transform;

            double delay = indexPath.Row * 0.2;

            UIView.Animate(1, delay, UIViewAnimationOptions.TransitionFlipFromBottom,
               () =>
               {
                   cell.Alpha = 1;
                   cell.Layer.Transform = CoreAnimation.CATransform3D.Identity;
               },finished => { }
              );
        
    }

Puedes jugar con estos valores CoreAnimation.CATransform3D.MakeTranslation (x, y, z); X Y Z para crear la animación que quieras con la transición.


Doble retraso = indexPath.Row * 0.2; Creo un retraso para las filas que muestran un pequeño retraso cuando se muestra de cell por primera vez. puedes crear tu animación sin demora agregando un valor de 0.

enter image description here

cell.Alpha = 0;

Esta otra línea permite ocultar la celda y cuando comienza la animación, la celda aparece con un efecto de desvanecimiento.

UIView.Animate(1, delay, UIViewAnimationOptions.TransitionFlipFromBottom,
               () =>
               {
                cell.Alpha = 1;
               },
                finished => { }
              );
2
Community 20 jun. 2020 a las 09:12

Swift 4 y solucione el problema de desplazamiento:

private var finishedLoadingInitialTableCells = false
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

    var lastInitialDisplayableCell = false

    //change flag as soon as last displayable cell is being loaded (which will mean table has initially loaded)
    if favorites.itemes.count > 0 && !finishedLoadingInitialTableCells {
        if let indexPathsForVisibleRows = tableView.indexPathsForVisibleRows,
            let lastIndexPath = indexPathsForVisibleRows.last, lastIndexPath.row == indexPath.row {
            lastInitialDisplayableCell = true
        }
    }

    if !finishedLoadingInitialTableCells {

        if lastInitialDisplayableCell {
            finishedLoadingInitialTableCells = true
        }

        //animates the cell as it is being displayed for the first time
        do {
            let startFromHeight = tableView.frame.height
            cell.layer.transform = CATransform3DMakeTranslation(0, startFromHeight, 0)
            let delay = Double(indexPath.row) * 0.2

            UIView.animate(withDuration: 0.7, delay: delay, options: UIViewAnimationOptions.transitionFlipFromBottom, animations: {
                do {
                    cell.layer.transform = CATransform3DIdentity
                }
            }) { (success:Bool) in

            }
        }
    }
}
3
Ahmed Lotfy 27 ago. 2018 a las 15:23

Swift 4:

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    do {
        let startFromHeight = tableView.frame.height
        cell.layer.transform = CATransform3DMakeTranslation(0, startFromHeight, 0)
        let delay = Double(indexPath.row) * 0.2

        UIView.animate(withDuration: 0.7, delay: delay, options: UIViewAnimationOptions.transitionFlipFromBottom, animations: {
            do {
                cell.layer.transform = CATransform3DIdentity
            }
        }) { (success:Bool) in

        }
    }
}
0
Ahmed Lotfy 27 ago. 2018 a las 10:58