UITableView的单元格选中颜色?

344

我创建了一个自定义的UITableViewCell。表格视图正在正确显示数据。我遇到的问题是,当用户触摸表格视图的单元格时,我想显示单元格的背景颜色,而不是默认的[蓝色]高亮选择值。

我使用下面的代码,但没起作用:

cell.selectionStyle = UITableViewCellSelectionStyleNone;
UIView *bgColorView = [[UIView alloc] init];
bgColorView.backgroundColor = [UIColor yellowColor];
[cell setSelectedBackgroundView:bgColorView];
cell.selectedBackgroundView.backgroundColor=[UIColor blackColor];
34个回答

705

无需自定义单元格。如果您只想更改单元格的选定颜色,可以这样做:

Objective-C:

UIView *bgColorView = [[UIView alloc] init];
bgColorView.backgroundColor = [UIColor redColor];
[cell setSelectedBackgroundView:bgColorView];

Swift:

let bgColorView = UIView()
bgColorView.backgroundColor = UIColor.red
cell.selectedBackgroundView = bgColorView

48
这个方法有效,但在分组的UITableView中,圆角被忽略了。 - David
1
@David 在分组表视图中,cornerRadius = 7 可以在任何地方使用吗?如果单元格在中间会怎样?我没有时间测试这个。 - Maciej Swic
2
对于 Swift 代码有一个小错误。正确的代码应该是 cell.selectedBackgroundView = bgColorView。 - John Kakon
15
请注意,为了使此方法起作用,在Storyboard(或XIB文件)中,您必须选择一个非“None”的选定背景颜色。这与某些答案相反,这些答案说您首先需要将其设置为“None”才能使其起作用。如果选择“None”,它将不起作用。直到我弄清楚这一点之前,我一直很困惑。谢谢。 - kakubei
1
当您同时使用Storyboard时,您将如何使其工作? - John
显示剩余12条评论

387

我认为你的思路是正确的,但根据selectedBackgroundView类的定义:

对于纯样式表格(UITableViewStylePlain)中的单元格,默认值为nil;对于分组样式表格(UITableViewStyleGrouped),默认值为非nil。

因此,如果你正在使用纯样式表格,则需要分配一个新的 UIView 并将其背景颜色设置为所需的颜色,然后将其分配给 selectedBackgroundView

或者,如果你只想在选中单元格时使用灰色背景,可以使用以下代码:

cell.selectionStyle = UITableViewCellSelectionStyleGray;

1
如果您喜欢将与视图相关的内容留给视图,那么此属性也可以在Storyboard中设置。 - IIllIIll
1
Swift 3版本:cell.selectionStyle = .gray // 您还可以使用.none、.blue或.default - Sébastien REMY
7
这个回答相当古老了...在较新的iOS版本中是否有一些变化? 我有一个简单样式的表格,我的selectedBackgroundView不是nil。 有趣的是,改变这个视图的背景颜色没有任何效果,相反,我必须用我想要的backgroundColor替换它,以使其正常工作。 - ndreisg
你刚刚让我免于彻底疯掉。非常感谢! - jbm
你可以像下面这样改变backgroundView的backgroundColor属性: cell.selectedBackgroundView?.backgroundColor = <你想要的颜色> - fingia

52

可以通过Interface Builder中的Storyboard设置表格视图单元格的选择背景颜色:

表格视图单元格选择颜色:无


1
我认为我们无法从Storyboard中设置自定义颜色。需要通过编程来设置它。 - pallavi
如果在编辑过程中有多选功能,这并不是一个好的解决方案。 - Yaroslav Dukal
你确实找到了好的解决方案吗?我现在正在处理这个问题。我不想要选择背景/条纹颜色。当我进入多选编辑模式时,我希望能够看到复选标记被选中,但不是颜色。我正在努力寻找使其工作的配置,让自己感到筋疲力尽。 - Travis Griggs

37

如果您有一个每个部分只有一个单元格的分组表格,只需将此额外行添加到代码中:bgColorView.layer.cornerRadius = 10;

UIView *bgColorView = [[UIView alloc] init];
[bgColorView setBackgroundColor:[UIColor redColor]];
bgColorView.layer.cornerRadius = 10;
[cell setSelectedBackgroundView:bgColorView];
[bgColorView release]; 

别忘了导入QuartzCore库。


34

Swift 3: 只有在 cellForRowAtIndexPath: 方法中使用,它才能为我工作。

let view = UIView()
view.backgroundColor = UIColor.red
cell.selectedBackgroundView = view

9
我认为更好的放置位置是awakeFromNib()方法(如果是自定义单元格)。 - LembergSun

22
以下内容在iOS 8中适用。
我必须将选择样式设置为UITableViewCellSelectionStyleDefault才能使自定义背景颜色生效。如果使用其他样式,则会忽略自定义背景颜色。似乎行为发生了变化,因为以前的答案需要将样式设置为无。
单元格的完整代码如下:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"MyCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // This is how you change the background color
    cell.selectionStyle = UITableViewCellSelectionStyleDefault;
    UIView *bgColorView = [[UIView alloc] init];
    bgColorView.backgroundColor = [UIColor redColor];
    [cell setSelectedBackgroundView:bgColorView];        
    return cell;
}

这段代码存在内存泄漏问题。任何"alloc"或对象创建必须在if (cell == nil) { }块中进行。否则,每次iOS释放单元格时都会创建视图。 - GeneCode

18

为你的表格单元格创建一个自定义单元格,在自定义单元格类.m中放入以下代码,它将有效地工作。你需要将所需颜色的图像放置在selectionBackground UIImage中。

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    UIImage *selectionBackground = [UIImage imageNamed:@"yellow_bar.png"];
    UIImageView *iview=[[UIImageView alloc] initWithImage:selectionBackground];
    self.selectedBackgroundView=iview;
}

2
我认为这种方法比在初始化单元格时设置selectedBackgroundView更加内存高效,因为只有在选择一个单元格时才创建背景视图。 - dotslashlu

14

Swift 3.0扩展

extension UITableViewCell {
    var selectionColor: UIColor {
        set {
            let view = UIView()
            view.backgroundColor = newValue
            self.selectedBackgroundView = view
        }
        get {
            return self.selectedBackgroundView?.backgroundColor ?? UIColor.clear
        }
    }
}

cell.selectionColor = UIColor.FormaCar.blue


1
添加IBDesignable和IBInspectable。 - Michał Ziobro
1
如果你想要的话,只需在变量上添加@IBInspectable即可。@IBDesignable对此没有用处。 - Nike Kov

10

在Swift 4中,您还可以全局设置表格单元的背景颜色(摘自这里):

let backgroundColorView = UIView()
backgroundColorView.backgroundColor = UIColor.red
UITableViewCell.appearance().selectedBackgroundView = backgroundColorView

9
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIView *view = [[UIView alloc] init];
    [view setBackgroundColor:[UIColor redColor]];
    [cell setSelectedBackgroundView:view];
}

在这个方法中,我们需要设置所选背景视图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接