在 iPhone 上设置表格视图单元格的背景颜色

Posted

技术标签:

【中文标题】在 iPhone 上设置表格视图单元格的背景颜色【英文标题】:Setting background color of a table view cell on iPhone 【发布时间】:2010-10-28 08:34:47 【问题描述】:

我想实现表格视图的一个单元格背景为蓝色,下一个单元格为白色,下一个单元格再次为蓝色,然后是白色等等的效果...你能告诉我吗我怎样才能做到这一点?

谢谢。

【问题讨论】:

可能重复:***.com/questions/281515/… @willcodejavaforfood 这是一个非常无益的评论,与 OPs 问题无关 【参考方案1】:

将此方法添加到您的表格视图委托中:

#pragma mark UITableViewDelegate
- (void)tableView: (UITableView*)tableView 
  willDisplayCell: (UITableViewCell*)cell 
forRowAtIndexPath: (NSIndexPath*)indexPath

    cell.backgroundColor = indexPath.row % 2 
        ? [UIColor colorWithRed: 0.0 green: 0.0 blue: 1.0 alpha: 1.0] 
        : [UIColor whiteColor];
    cell.textLabel.backgroundColor = [UIColor clearColor];
    cell.detailTextLabel.backgroundColor = [UIColor clearColor];

【讨论】:

+1 这行得通,并且是我可以坚持 textLabel.backgroundColor 设置的唯一方法。在 tableView:cellForRowAtIndexPath: 中设置它对我不起作用(OS 3.2),但确实如此。 有一个 2009 年或 2010 年的旧 WWDC 视频涵盖了这一点。表格视图将调整背景以管理单元格的选择状态,这就是为什么您可以可靠地修改它的唯一地方是 willDisplayCell 方法。 有谁明白为什么在 cellforrowatindex 中设置它不能正常工作?我尝试过这种方法,但 %2 并没有对每隔一行正确执行。当您上下滚动几次时,每个单元格的背景都会发生变化。 willDisplayCell 虽然有效,只是想知道为什么不适用于 cellforrow 见上面 Mike Weller 的回答【参考方案2】:

你必须设置单元格内容视图的背景颜色

cell.contentView.backgroundColor = [UIColor colorWithRed...]

这将设置整个单元格的背景。 要对备用单元格执行此操作,请使用 indexPath.row% by 2。

【讨论】:

感谢您的回复。我试过了,但它只将单元格的两端显示为蓝色/橙色,但我希望整个单元格都有颜色 如果你使用 cell.backgroundColor,你会得到蓝色/橙色的末端。如果您使用 cell.contentView.backgroundColor,整个单元格将被着色,除非您的单元格中有任何具有白色背景的控件(如标签)。在这种情况下,您也必须更改它们的背景颜色。否则 contentView.backgroundColor 方法到目前为止对我有用。 我来到这里寻找如何更改整个单元格的背景颜色,但是发布的问题并不完全相关,但这个答案对我有用,谢谢 刚刚添加了一行 "cell.backgroundColor = cell.contentView.backgroundColor;" 谢谢【参考方案3】:

如果您想根据实际单元格数据对象中的某些状态设置单元格颜色,那么这是另一种方法:

如果将此方法添加到表视图委托中:

- (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 方法中再次检索数据对象的麻烦。

【讨论】:

我发现这种方法还避免了必须弄乱文本标签背景——tableView 似乎会自动调整它们以匹配单元格背景颜色。对于我的用例,这是此处提供的答案中最简单的解决方案。【参考方案4】:

请在 cellForRowAtIndexPath 中添加以下代码

if (indexPath.row % 2 == 0)
    cell.backgroundColor =[UIColor blueColor];
 else 
    cell.backgroundColor =[UIColor whiteColor];

我认为这会对你有所帮助

【讨论】:

【参考方案5】:

只要您不使用 UITableViewCell 的内置标签,lostInTransit 的答案中的cell.contentView.backgroundColor = [UIColor colorWithRed...] 方法就可以工作。

我发现如果你使用内置标签,例如通过设置cell.text,您最终会在标签下方看到一个不透明的白色块,并且只有单元格的两端显示您想要的颜色。

我发现无法编辑内置标签,因此它是不透明的(您可以通过UILabel* cellLabel = [cell.contentView.subviews objectAtIndex:0] 访问它)。

我通过添加我自己的自定义UILabel 解决了这个问题。像这样:

UILabel* cellLabel = [[[UILabel alloc] initWithFrame:cell.frame] autorelease];
cellLabel.text = @"Test with non-opaque label";
cellLabel.backgroundColor = [UIColor clearColor];
cellLabel.opaque = NO;

[cell.contentView addSubview:cellLabel];
cell.contentView.backgroundColor = [UIColor darkGrayColor];

【讨论】:

当您可以更改单元格的背景颜色时,您不应该创建标签并更改其背景颜色。 cell.backgroundColor = [UIColor ...]【参考方案6】:

当使用默认表格单元格设置时,以下两个属性将为单元格的背景和标签的背景颜色着色,避免需要创建自定义标签作为单元格内容视图的子视图。

cell.textLabel.backgroundColor = [UIColor redColor];
cell.contentView.backgroundColor = [UIColor redColor];

【讨论】:

这个答案澄清了其他一些答案中概述的一些问题,但我没有必要的评级来评论它们。【参考方案7】:

//省时方法:

//在索引方法的单元格中:

static NSString* evenIdentifier = @"even";
static NSString* oddIdentifier = @"odd";

__weak identifier;
if(indexPath.row %2 ==0)

    identifier = evenIdentifier;
else
    identifier = oddIdentifier;


cell = dequeue..WithIdentifier: identifier;
if(cell == nil)
    cell = allocOrLoadNib...;
    cell.backgroundColor = (indexPath.row %2 ==0 ? evenColor : oddColor);

// 改变单元格内容,然后返回。轻松的工作。

// 这是一个大纲代码。请不要直接复制。

【讨论】:

【参考方案8】:

这对我有用 .. 在 cellForRowAtIndexPath 中,

cell.textLabel.backgroundColor = [UIColor clear];
cell.detailTextLabel.backgroundColor = [UIColor clearColor];
cell.contentView.backgroundColor = [UIColor grayColor]; //whichever color u want
cell.backgroundColor = cell.contentView.backgroundColor;

根据您的要求,如前所述,您可以根据 indexPath % 2 值执行上述功能。

【讨论】:

【参考方案9】:

对于您使用内置文本标签并且不希望文本标签的白色背景颜色遮盖背景颜色的情况,此代码是一个稍微干净的解决方案。这也解决了违反分组样式的表格视图的圆角的问题(当您使用 cell.contentView.backgroundColor 而不是 cell.backgroundColor 时会发生这种情况):

UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
cell.backgroundColor = [UIColor redColor];
cell.textLabel.backgroundColor = [UIColor clearColor]; //transparent background

【讨论】:

【参考方案10】:
    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];

【讨论】:

【参考方案11】:

您需要做的就是在表的视图控制器实现文件中添加以下代码。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
if (indexPath.row%2 == 0) 
    UIColor *altCellColor = [UIColor blackColor];
    cell.backgroundColor = altCellColor;

然后就像添加和更改模值一样简单。

【讨论】:

【参考方案12】:

backgroundView 添加到单元格并设置您选择的背景颜色。

let backgroundView = View() //  add background view via code or via storyboard
view.backgroundColor = UIColor.red // your color
cell.backgroundView = backgroundView

【讨论】:

以上是关于在 iPhone 上设置表格视图单元格的背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

在表格视图中更改单元格的背景行为不符合预期[关闭]

如何更改分组的表格视图单元格的背景?

iOS UITableView:更改表格的背景颜色会覆盖单元格的背景颜色

如何读取表格视图中所选行的背景颜色?

静态部分/单元格的 UITableView 背景图像

滚动单元格时表格视图设置消失