Answers:
您需要将单元格contentView的backgroundColor设置为您的颜色。如果您使用附件(例如公开箭头等),它们将显示为白色,因此您可能需要滚动自定义版本的附件。
UITableViewCellAccessoryCheckmark
?谢谢。
cell.textLabel.backgroundColor = [UIColor clearColor];
这是我遇到的解决此问题的最有效方法,请使用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]];
在我的情况下,此解决方案效果很好...
cell.backgroundColor = UIColor.clearColor
这非常简单,因为OS 3.0只是在willDisplayCell方法中设置单元格的背景色。您不得在cellForRowAtIndexPath中设置颜色。
这适用于普通样式和分组样式:
码:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
cell.backgroundColor = [UIColor redColor];
}
PS:这里是willDisplayCell的文档摘录:
“表视图在使用单元格绘制行之前将消息发送给它的委托人,从而允许委托人在显示该对象之前对其进行自定义。此方法使委托人有机会覆盖之前设置的基于状态的属性。表格视图,例如选择和背景颜色。在委托返回之后,表格视图仅设置alpha和frame属性,然后仅在为行滑动时设置动画。”
我在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;
}
}
vlado.grigorov有一些好的建议-最好的方法是创建一个backgroundView,并给它一种颜色,将其他所有内容设置为clearColor。另外,我认为这种方法是正确清除颜色的唯一方法(尝试使用他的示例-但设置为“ clearColor”而不是“ yellowColor”),这就是我要尝试的方法。
自定义表格视图单元格的背景最终成为一种“全有还是全无”的方法。很难以一种看起来并不奇怪的方式更改用于内容单元格背景的颜色或图像。
原因是单元格实际上跨越了视图的宽度。圆角只是其绘制样式的一部分,内容视图位于该区域中。
如果更改内容单元格的颜色,最终将在拐角处看到白色位。如果更改整个单元格的颜色,将有一个跨视图宽度的颜色块。
您绝对可以自定义单元格,但是它并不像您一开始想的那么简单。
扩展N.Berendt的答案-如果您要基于实际单元格数据对象中的某些状态设置单元格颜色,则在配置表格单元格的其余信息时,通常是在cellForRowAtIndexPath方法,您可以通过重写willDisplayCell方法以从内容视图背景色中设置单元格背景色来实现此目的-可以解决显示按钮背景等问题,但仍然可以在cellForRowAtIndexPath方法中控制颜色您正在执行所有其他单元格定制的地方。
因此:如果将此方法添加到表视图委托中:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
cell.backgroundColor = cell.contentView.backgroundColor;
}
然后,在您的cellForRowAtIndexPath方法中,您可以执行以下操作:
if (myCellDataObject.hasSomeStateThatMeansItShouldShowAsBlue) {
cell.contentView.backgroundColor = [UIColor blueColor];
}
这样既省去了在willDisplayCell方法中再次检索数据对象的麻烦,又节省了在两个位置进行表单元的定制/自定义的地方-所有自定义项都可以在cellForRowAtIndexPath方法中进行。
创建图像以用作Photoshop或gimp的背景,并将其命名为myimage。然后,将此方法添加到tableViewController类中:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
UIImage *cellImage = [UIImage imageNamed:@"myimage.png"];//myimage is a 20x50 px with gradient color created with gimp
UIImageView *cellView = [[UIImageView alloc] initWithImage:cellImage];
cellView.contentMode = UIContentViewModeScaleToFill;
cell.backgroundView = cellView;
//set the background label to clear
cell.titleLabel.backgroundColor= [UIColor clearColor];
}
如果您已将UITableView设置为在属性检查器中自定义,这也将起作用。
我的解决方案是将以下代码添加到cellForRowAtIndexPath事件:
UIView *solidColor = [cell viewWithTag:100];
if (!solidColor) {
solidColor = [[UIView alloc] initWithFrame:cell.bounds];
solidColor.tag = 100; //Big tag to access the view afterwards
[cell addSubview:solidColor];
[cell sendSubviewToBack:solidColor];
[solidColor release];
}
solidColor.backgroundColor = [UIColor colorWithRed:254.0/255.0
green:233.0/255.0
blue:233.0/255.0
alpha:1.0];
即使在使用公开按钮的情况下,它也可以在任何情况下工作,并且与我认为的cellWillShow事件相比,使您的逻辑更好地对cellForRowAtIndexPath中的单元格颜色状态进行操作。
UIView *bg = [[UIView alloc] initWithFrame:cell.frame];
bg.backgroundColor = [UIColor colorWithRed:175.0/255.0 green:220.0/255.0 blue:186.0/255.0 alpha:1];
cell.backgroundView = bg;
[bg release];
这将在最新的Xcode中工作。
-(UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {
cell.backgroundColor = [UIColor grayColor];
}