Tengo UITableView
que usa UITableViewCell
s personalizado. Las celdas pueden tener uno de tres tipos de imágenes de fondo (establecidas en la propiedad .backgroundView.image
de cada celda): superior, central o inferior. Las imágenes superior e inferior son para la primera y la última celda, y tienen esquinas redondeadas (muy parecido a las células agrupadas de UITableView
). Todas las otras celdas "centrales" dentro del UITableView
tienen una imagen de fondo media rectangular.Recargando UITableViewCell personalizado después de reordenar las celdas
Mi problema es que cuando la reordenación de las células en el modo Editar la UITableView
's las células no se actualizan con una imagen de fondo diferente en función de su nueva ubicación. Por ejemplo, si muevo la primera celda al centro de la tabla, aún conserva su imagen de fondo "superior" original (con esquinas redondeadas) y la nueva celda que aparece en la parte superior de la vista de tabla todavía tiene su "centro" original imagen de fondo, que todo parece un poco extraño.
Puedo evitar esto haciendo un reloadData
en la vista de tabla, pero esto tiene el problema de no dar una bonita y graciosa animación de los cambios. Observé que al reordenar un estándar agrupado UITableView
tan pronto como se mueve/arrastra una celda, la imagen de fondo en las celdas relevantes cambia (incluso antes de que la celda movida se haya caído en su nueva ubicación), lo que se ve muy bien. Me gustaría lograr lo mismo.
Para este fin, he implementado tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath
que se llama cada vez que se arrastra una fila en la vista de tabla. Dentro de esto, he intentado varios métodos para configurar el backgroundView.image
, incluida la configuración directa de la imagen y luego también explícitamente diciéndole que vuelva a dibujar la celda y/o imagen usando setNeedsLayout
y setNeedsDisplay
pero nada parece hacer que la celda vuelva a dibujarse. Tengo NSLog
'ged los resultados de estos cambios y parecen comprometerse con la celda, ya que los valores correctos aparecen en el NSLog
, pero la celda simplemente no parece actualizarse en la pantalla.
Si alguien pudiera señalar lo que estoy haciendo mal, o sugerir una forma mejor de lograr un resultado de trabajo, estaría muy agradecido. ¡Gracias!
EDIT: el siguiente código fue retirado de la generosidad y formateado para que pueda ser más fácil de digerir:
UIImage *rowBackground;
UIImage *selectionBackground;
NSInteger sectionRows = [_tableView numberOfRowsInSection:[indexPath section]];
NSInteger row = [indexPath row];
if (row == 0 && row == sectionRows - 1)
{
rowBackground = [UIImage imageNamed:@"field_title_bkg.png"];
selectionBackground = [UIImage imageNamed:@"field_title_bkg.png"];
}
else if (row == 0)
{
rowBackground = [UIImage imageNamed:@"table_row_top_bkg.png"];
selectionBackground = [UIImage imageNamed:@"table_row_top_bkg.png"];
}
else if (row == sectionRows - 1)
{
rowBackground = [UIImage imageNamed:@"table_bottom_row_bkg.png"];
selectionBackground = [UIImage imageNamed:@"table_bottom_row_bkg.png"];
}
else
{
rowBackground = [UIImage imageNamed:@"table_row_bkg.png"];
selectionBackground = [UIImage imageNamed:@"table_row_bkg.png"];
}
UIImageView *rowBackGroundImageView = [[UIImageView alloc] initWithImage:rowBackground];
UIImageView *rowBackGroundSelectionImageView = [[UIImageView alloc] initWithImage:selectionBackground];
if (row != sectionRows - 1)
{
UIImageView *sep = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cell_separator.png"]];
[sep setFrame:CGRectMake(20, 56, 280, 1)];
[rowBackGroundImageView addSubview:sep];
}
[cell setBackgroundView:rowBackGroundImageView];
[rowBackGroundImageView release];
Puede intentar enmascarar la vista de tabla con otra vista encima. Entonces no necesitarás imágenes de fondo para las células. – Eimantas
¿Podría explicar esta idea un poco más? No entiendo muy bien cómo funcionaría eso. – Skoota
Una pregunta relacionada: http://stackoverflow.com/questions/7338161/update-old-new-top-bottom-cells-backgroundview-when-inserting-deleting-top-bott – an0