2011-05-18 11 views
5

Tengo una tabla con sombras sobre la parte superior y debajo de la celda inferior (usando la solución de Matt Gallagher aquí: http://cocoawithlove.com/2009/08/adding-shadow-effects-to-uitableview.html). Estos se agregan en el método layoutSubviews de la extensión de clase UITableView.Devolución de llamada UITableView después de la animación de eliminación de fila completa

Agrego y elimino dinámicamente celdas debajo de cada celda principal (estas proporcionan datos adicionales) - llamemos a estas celdas de "detalles". Solo hay uno abierto cada vez. Al eliminar la "celda de detalles" debajo de la última celda principal, cuando comienza la animación, la sombra se desplaza hacia arriba hasta la última celda (arriba de la celda de detalles). Hace esto porque los métodos layoutSubview consideran que la última celda de la tabla ha cambiado en el momento en que comienza la animación de deleteRowsAtIndexPaths (en lugar de cuando finaliza la animación).

Por lo tanto, en esencia, necesito una manera de mantener la sombra debajo de la celda de detalles, ya que se elimina. No estoy seguro de la mejor manera de hacer esto. Si el UITableView ya no se considera que la célula sea la última celda, entonces no estoy seguro de que incluso cómo conseguir la célula (ya que el UITableView obtiene la célula por lo tanto):

NSIndexPath *lastRow = [indexPathsForVisibleRows lastObject]; 
if ([lastRow section] == [self numberOfSections] - 1 && 
    [lastRow row] == [self numberOfRowsInSection:[lastRow section]] - 1) 
{ 
     //adds shadow below it here 
    } 

Así que, atrapando al inicio de la animación no sirve de mucho si el UITableView todavía piensa que la celda principal sobre la celda "detail" es "lastObject".

Gracias por cualquier idea.

+0

has necesitado añadir la parte superior y la sombra inferior como ' tableHeaderView' y 'tableFooterView' respectivamente? Sin duda, estas vistas se mantienen en su lugar y se mueven adecuadamente cuando la tabla cambia de tamaño después de una animación de eliminación. – simeon

Respuesta

0

Estoy seguro de que puede lograrlo fácilmente mediante el uso de una clase de vista de tabla personalizada en lugar de usar dependencias del trabajo de marco externo simplemente heredar de la vista útil y agregarle subvistas.

Pero si insiste en mantenerlo de esta manera. toma una referencia en tu propia variable antes de eliminarla.

+0

La vista de tabla sombreada de Matt Gallager ** es ** una clase de tabla personalizada ... ¿cuál es tu punto? – fezfox

+0

Quiero decir que añada vistas secundarias a esa vista de tabla y en esa subvista añada esa imagen de degradado. –

+0

Ok, eso es una sugerencia, pero ¿cómo propone dónde colocar esa vista? El punto que hice en el OP es que, en el momento en que comienza la animación para eliminar la celda final, [indexPathsForVisibleRows lastObject] reflejará inmediatamente la fila de arriba. Entonces, si esa es la referencia que usa para ubicar su sombra (como lo es en este momento) en el momento en que comienza la animación, la sombra se desplaza hacia arriba hacia la celda de arriba. Quizás lo real sea detener la actualización de esa sombra hasta que se complete la animación O la sugerencia anterior para usar tableFooterView en su lugar. Me rendí hace un año, gracias de todos modos – fezfox

4

Prueba este

[CATransaction begin]; 

[tableView beginUpdates]; 

//... 

[CATransaction setCompletionBlock: ^{ 
    // Code to be executed upon completion 
}]; 

[tableView deleteRowsAtIndexPaths: indexPaths 
       withRowAnimation: UITableViewRowAnimationAutomatic]; 


[tableView endUpdates]; 

[CATransaction commit]; 
+0

Necesitaba actualizar la tabla después de completar la animación 'deleteRowsAtIndexPaths: withRowAnimation', esto lo hizo por mí. ¡Gracias! tal vez en 2015 hay una mejor manera? – ToddB

+0

¡no, Apple debería agregar una devolución de llamada para esto! –

0

Swift (la idea es la misma, por supuesto, puedes utilizar esto en obj-c):

UIView.animateWithDuration(0.3, animations: {() -> Void in 
    self.tableView.scrollToRowAtIndexPath(indexPathes, withRowAnimation: UITableViewRowAnimation.None) 
}, completion: { (Bool) -> Void in 
    // The logic you want to execute after the animation 
}) 
Cuestiones relacionadas