У меня есть 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];