【发布时间】:2010-11-21 10:18:39
【问题描述】:
我有UITableView,它使用自定义UITableViewCells。单元格可以具有三种类型的背景图像之一(在每个单元格的.backgroundView.image 属性中设置):顶部、中间或底部。顶部和底部图像用于第一个和最后一个单元格,并且具有圆角(很像分组的UITableView 的单元格)。 UITableView 中的所有其他“中间”单元格都有一个矩形中间背景图像。
我的问题是,在 UITableView 的 Edit 模式中重新排序单元格时,单元格不会根据其新位置刷新不同的背景图像。例如,如果我将第一个单元格移动到表格的中间,它仍然保留其原始的“顶部”背景图像(带有圆角),并且出现在表格视图顶部的新单元格仍然具有其原始的“中间”背景图片,看起来有点奇怪。
我可以通过在表格视图上执行reloadData 来解决此问题,但这存在无法为更改提供优美优美的动画的问题。我注意到,在重新排序标准分组 UITableView 时,只要移动/拖动单元格,相关单元格上的背景图像就会发生变化(甚至在移动的单元格被放到新位置之前),这看起来非常好。我也想实现同样的目标。
为此,我实现了tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath,每次在表格视图中拖动一行时都会调用它。在此我尝试了各种设置backgroundView.image 的方法,包括直接设置图像,然后还明确告诉它使用setNeedsLayout 和setNeedsDisplay 重绘单元格和/或图像,但似乎没有任何东西使单元格重绘。我有NSLog'ged 这些更改的结果,它们似乎正在提交到单元格,因为正确的值出现在 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];
【问题讨论】:
-
您可以尝试在表格视图上使用另一个视图来掩盖表格视图。那么你就不需要细胞的背景图像了。
-
你能再解释一下这个想法吗?我不太了解它是如何工作的。
-
您的代表的
- (void)tableView:willDisplayCell:forRowAtIndexPath:是否被呼叫?我发现自定义背景最可靠的地方就是这种方法。 -
我认为这与仍在编辑的单元格有关。您可以尝试以下代码,但请注意,在后台绘制不是线程安全的,您根本不应该使用它 - 仅用于测试:
[tableView performSelectorInBackground:@selector(reloadData) withObject:nil]; // or setNeedsDisplay:
标签: iphone cocoa-touch uikit uitableview