У меня есть UITableView
, который использует пользовательские UITableViewCell
с. Ячейки могут иметь один из трех типов фоновых изображений (задается в свойстве .backgroundView.image
каждой ячейки): верх, середина или низ. Верхнее и нижнее изображения предназначены для первой и последней ячеек и имеют закругленные углы (очень похоже на сгруппированные ячейки UITableView
). Все остальные «средние» ячейки в пределах UITableView
имеют прямоугольное среднее фоновое изображение.
Моя проблема заключается в том, что при изменении порядка ячеек в режиме 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];