Desvanecerse en UITableViewCell fila por fila en Swift

Soy nuevo en Swift, estoy tratando de tener un UITableView y las celdas estarán animadas para aparecer una por una. ¿Cómo puedo hacer eso? Además, si la fila de celda aparecida recientemente no está en la pantalla (se esconde debajo de la tabla). ¿Cómo puedo mover la tabla cuando aparecen cada celda?

var tableData1: [String] = ["1", "2", "3", "4", "5", "6", "7"] override func viewWillAppear(animated: Bool) { tableView.scrollEnabled=false tableView.alpha=0.0 NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(3), target: self, selector: "animateTable", userInfo: nil, repeats: false) } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.tableData1.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell:TblCell = self.tableView.dequeueReusableCellWithIdentifier("cell") as! TblCell cell.lblCarName.textAlignment = NSTextAlignment.Justified; return cell } func animateTable() { //what should be the code?// } 

En UITableView, las filas se preparan automáticamente para usted cuando llegan a estar en su "visión de range". Supongo que, al less no al principio, puede desplazarse por tableView, por lo que lo desplazaremos mediante progtwigción haciendo que las filas aparezcan a medida que avanza. ¿Cómo lo estamos haciendo? En realidad, UITableView tiene un método que nos permite desplazarlo a una fila específica:

 scrollToRowAtIndexPath(indexPath : NSIndexPath, atScrollPosition : UITableViewScrollPosition, animated : Bool); 

Estoy demasiado cansado para escribir el código, así que intentaré explicarlo. Primero, para cada celda, establece alfa en 0, tan pronto como se carguen (cellForRowAtIndexPath). Entonces supongamos que nuestra pantalla se ajusta a las 5 primeras filas. Va a animar sus alfas de forma secuencial (usando UIView.animateWithDuration) hasta el quinto (índice 4), luego recorrerá el scrollToRowAtIndexPath pasando NSIndexPath usando 5, luego 6, … hasta el rest (usando scrollPosition =. Fondo). Y para cada uno de ellos, animarías tan pronto como se carguen. Solo restring poner algo de time entre estas interacciones. (anima primero, ejecuta NSTimer en el segundo y continúa). Y el boolean animado debería ser cierto, por supuesto.

Paso 1

En su método cellForRowAtIndexPath donde inicializa su celda, esconderlo así;

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell:TblCell = self.tableView.dequeueReusableCellWithIdentifier("cell") as! TblCell cell.lblCarName.textAlignment = NSTextAlignment.Justified cell.contentView.alpha = 0 return cell } 

Paso 2

Hagamos animation de desvanecimiento. UITableViewDelegate tiene los methods willDisplayCell que pueden detectar que cuando se desplace hacia arriba o hacia abajo, la primera celda se mostrará en la window.

 func tableView(tableView: UITableView!, willDisplayCell cell: UITableViewCell!, forRowAtIndexPath indexPath: NSIndexPath!) { UIView.animateWithDuration(0.8, animations: { cell.contentView.alpha = 1.0 }) //Swift 3.0 /* UIView.animate(withDuration: 0.8, animations: { cell.contentView.alpha = 1.0 }) */ } 

Tu animation de desvanecimiento está en progreso. Lo más importante es que no puede configurar el alfa de su celda directamente en time de ejecución porque iOS está haciendo un manejo interno especial con la celda como parte de su UITableView e ignora su configuration. Por lo tanto, si configura contentView su celda, ¡será rock!

Aquí hay un código que puede ayudarle a comenzar. En mi COBezierTableView subclass UITableView y layoutSubviews método layoutSubviews . Allí puede manipular las celdas de acuerdo con su position relativa en la vista. En este ejemplo, los desvaneces en la parte inferior.

 import UIKit public class MyCustomTableView: UITableView { // MARK: - Layout public override func layoutSubviews() { super.layoutSubviews() let indexpaths = indexPathsForVisibleRows! let totalVisibleCells = indexpaths.count - 1 if totalVisibleCells <= 0 { return } for index in 0...totalVisibleCells { let indexPath = indexpaths[index] if let cell = cellForRowAtIndexPath(indexPath) { if let superView = superview { let point = convertPoint(cell.frame.origin, toView:superView) let pointScale = point.y / CGFloat(superView.bounds.size.height) cell.contentView.alpha = 1 - pointScale } } } } } 
 extension UITableView { func tvFadeCell() { self.reloadData() var delayCounter = 0.0 for cell in self.visibleCells { cell.alpha=0.0 UIView.animate(withDuration: TimeInterval(delayCounter),animations: { cell.alpha = 1.0 }, completion: nil) delayCounter+=0.30 } } } 

¿Qué tal esto?