Перезагрузка пользовательского UITableViewCell после переупорядочения ячеек

У меня есть UITableView , который использует пользовательские UITableViewCell s. Ячейки могут иметь один из трех типов фоновых изображений (задается в свойстве .backgroundView.image каждой ячейки): верхнее, среднее или нижнее. Верхнее и нижнее изображения предназначены для первой и последней ячеек и имеют закругленные углы (очень похоже на сгруппированные ячейки UITableView ). Все остальные «средние» ячейки в UITableView имеют прямоугольное среднее фоновое изображение.

Моя проблема в том, что при изменении порядка ячеек в режиме Edit в UITableView ячейки меняют порядок не обновлять с использованием другого фонового изображения в зависимости от их нового местоположения. Например, если я перемещаю первую ячейку в середину таблицы, она по-прежнему сохраняет свое исходное «верхнее» фоновое изображение (с закругленными углами), а новая ячейка, которая появляется в верхней части представления таблицы, по-прежнему имеет исходную «середину». фоновое изображение, которое все выглядит немного странно.

Я могу обойти это, выполнив reloadData в табличном представлении, но это не дает хорошей изящной анимации изменений. Я заметил, что при переупорядочении стандартного сгруппированного UITableView , как только ячейка перемещается / перетаскивается, фоновое изображение в соответствующих ячейках изменяется (даже до того, как перемещенная ячейка была помещена в новое место), что выглядит очень красиво . Я хотел бы добиться того же.

С этой целью я реализовал tableView: targetIndexPathForMoveFromRowAtIndexPath: toProposedIndexPath , который вызывается каждый раз, когда перетаскивается строка в представлении таблицы. В рамках этого я пробовал различные методы установки backgroundView.image , включая прямую установку изображения, а затем также явное указание ему перерисовать ячейку и / или изображение с помощью setNeedsLayout и ] setNeedsDisplay , но кажется, что ничто не заставляет ячейку перерисовываться. У меня NSLog ' получил результаты этих изменений, и кажется, что они фиксируются в ячейке, поскольку правильные значения появляются в NSLog , но ячейка просто не обновляется на экране.

Если бы кто-нибудь мог указать, что я делаю неправильно, или предложить лучший способ достижения результата работы, я был бы очень признателен. Спасибо!

РЕДАКТИРОВАТЬ: следующий код был извлечен из награды и отформатирован, чтобы его было легче переваривать:

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];
8
задан john.k.doe 14 July 2012 в 02:31
поделиться