我想自定义UITableView中所有UITableViewCells的背景(也可能是边框).到目前为止,我还没有能够自定义这些东西,所以我有一堆白色背景单元格,这是默认的.
有没有办法用iPhone SDK做到这一点?
这是我遇到解决此问题的最有效方法,使用willDisplayCell委托方法(当使用cell.textLabel.text和/或cell.detailTextLabel.text时,这也会处理文本标签背景的白色. ):
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { ... }
调用此委托方法时,单元格的颜色是通过单元格而不是表格视图控制的,就像使用时一样:
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath { ... }
因此,在单元格委托方法的主体内,将以下代码添加到单元格的替换颜色中,或者只使用函数调用使表格的所有单元格颜色相同.
if (indexPath.row % 2) { [cell setBackgroundColor:[UIColor colorWithRed:.8 green:.8 blue:1 alpha:1]]; } else [cell setBackgroundColor:[UIColor clearColor]];
这种解决方案在我的环境中运作良好......
您需要将单元格contentView的backgroundColor设置为您的颜色.如果您使用附件(例如公开箭头等),它们将显示为白色,因此您可能需要滚动这些的自定义版本.
这非常简单,因为OS 3.0只是在willDisplayCell方法中设置单元格的背景颜色.您不能在cellForRowAtIndexPath中设置颜色.
这适用于普通和分组样式:
码:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { cell.backgroundColor = [UIColor redColor]; }
PS:这里是willDisplayCell的文档摘录:
"表视图在使用单元格绘制行之前将此消息发送到其委托,从而允许委托在显示单元格对象之前自定义单元格对象.此方法使委托者有机会覆盖之前设置的基于状态的属性.表视图,如选择和背景颜色.委托返回后,动画行仅当它们在滑入或滑出表视图仅设定α和框架属性,然后".
我在colionel的这篇文章中找到了这些信息.谢谢他!
到目前为止,我发现的最佳方法是设置单元格的背景视图并清除单元格子视图的背景.当然,只有带索引样式的桌子,无论有没有配件,这看起来都很不错.
这是一个样本,其中单元格的背景是黄色的:
UIView* backgroundView = [ [ [ UIView alloc ] initWithFrame:CGRectZero ] autorelease ]; backgroundView.backgroundColor = [ UIColor yellowColor ]; cell.backgroundView = backgroundView; for ( UIView* view in cell.contentView.subviews ) { view.backgroundColor = [ UIColor clearColor ]; }
简单地把它放在你的UITableView委托类文件(.m)中:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { UIColor *color = ((indexPath.row % 2) == 0) ? [UIColor colorWithRed:255.0/255 green:255.0/255 blue:145.0/255 alpha:1] : [UIColor clearColor]; cell.backgroundColor = color; }
我同意Seba,我试图在rowForIndexPath委托方法中设置我的交替行颜色,但是在3.2和4.2之间得到了不一致的结果.以下对我来说很有用.
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if ((indexPath.row % 2) == 1) { cell.backgroundColor = UIColorFromRGB(0xEDEDED); cell.textLabel.backgroundColor = UIColorFromRGB(0xEDEDED); cell.selectionStyle = UITableViewCellSelectionStyleGray; } else { cell.backgroundColor = [UIColor whiteColor]; cell.selectionStyle = UITableViewCellSelectionStyleGray; } }
在尝试所有不同的解决方案后,以下方法是最优雅的方法.更改以下委托方法中的颜色:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if (...){ cell.backgroundColor = [UIColor blueColor]; } else { cell.backgroundColor = [UIColor whiteColor]; } }