58

有谁知道如何使用 UITableViewCell 为每个选定的单元格更改单元格的背景颜色?我在 TableView 的代码中创建了这个 UITableViewCell。

4

30 回答 30

95

更改属性 selectedBackgroundView 是正确且最简单的方法。我使用以下代码更改选择颜色:

// set selection color
UIView *myBackView = [[UIView alloc] initWithFrame:cell.frame];
myBackView.backgroundColor = [UIColor colorWithRed:1 green:1 blue:0.75 alpha:1];
cell.selectedBackgroundView = myBackView;
[myBackView release];
于 2010-07-05T04:45:00.803 回答
39

我终于设法让它在样式设置为 Grouped 的表格视图中工作。

首先将selectionStyle所有单元格的属性设置为UITableViewCellSelectionStyleNone

cell.selectionStyle = UITableViewCellSelectionStyleNone;

然后在您的表视图委托中实现以下内容:

static NSColor *SelectedCellBGColor = ...;
static NSColor *NotSelectedCellBGColor = ...;

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSIndexPath *currentSelectedIndexPath = [tableView indexPathForSelectedRow];
    if (currentSelectedIndexPath != nil)
    {
        [[tableView cellForRowAtIndexPath:currentSelectedIndexPath] setBackgroundColor:NotSelectedCellBGColor];
    }

    return indexPath;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [[tableView cellForRowAtIndexPath:indexPath] setBackgroundColor:SelectedCellBGColor];
}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (cell.isSelected == YES)
    {
        [cell setBackgroundColor:SelectedCellBGColor];
    }
    else
    {
        [cell setBackgroundColor:NotSelectedCellBGColor];
    }
}
于 2012-02-17T08:25:10.140 回答
21

SWIFT 4、XCODE 9、IOS 11

经过一些测试后,当表格视图选择设置为“多项选择”时,取消选择或第二次点击单元格时将删除背景颜色当表格视图样式设置为“分组”时也有效。

extension ViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if let cell = tableView.cellForRow(at: indexPath) {
            cell.contentView.backgroundColor = UIColor.darkGray
        }
    }
}

注意:为了使此功能如下所示,您的单元格的选择属性可以设置为任何值,但无。

不同选项的外观

款式:素色,选择:单选

单选

风格:素色,选择:多选

多项选择

样式:分组,选择:多选

分组多项选择

奖金 - 动画

要获得更平滑的颜色过渡,请尝试一些动画:

extension ViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if let cell = tableView.cellForRow(at: indexPath) {
            UIView.animate(withDuration: 0.3, animations: {
                cell.contentView.backgroundColor = UIColor.darkGray
            })
        }
    }
}

动画颜色过渡

奖金 - 文字和图像更改

您可能会注意到,选择单元格时,图标和文本颜色也会更改。这会在您设置 UIImage 和 UILabel Highlighted 属性时自动发生

UIImage

  1. 提供两个彩色图像:

两个彩色图像

  1. 设置突出显示的图像属性:

突出显示的属性

UIL标签

只需为 Highlighted 属性提供颜色:

突出显示的颜色

于 2018-02-28T05:01:26.447 回答
19
// animate between regular and selected state
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {

    [super setSelected:selected animated:animated];

    if (selected) {
        self.backgroundColor = [UIColor colorWithRed:234.0f/255 green:202.0f/255 blue:255.0f/255 alpha:1.0f];
    }
    else {
        self.backgroundColor = [UIColor clearColor];
    }
}
于 2013-07-04T12:25:03.087 回答
12
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

     UITableViewCell *cell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
     cell.contentView.backgroundColor = [UIColor yellowColor];

}
于 2013-06-20T08:50:39.617 回答
11

我创建了 UIView 并设置了单元格 selectedBackgroundView 的属性:

UIView *v = [[UIView alloc] init];
v.backgroundColor = [UIColor redColor];
cell.selectedBackgroundView = v;
于 2014-03-12T06:17:02.093 回答
7

如果您在谈论选定的单元格,则属性为-selectedBackgroundView. 这将在用户选择您的单元格时显示。

于 2010-03-10T16:02:49.690 回答
6

我有一个高度定制的 UITableViewCell。所以我实现了我自己的单元格选择。

cell.selectionStyle = UITableViewCellSelectionStyleNone;

我在单元格的类中创建了一个方法:

- (void)highlightCell:(BOOL)highlight
{
    if (highlight) {
        self.contentView.backgroundColor = RGB(0x355881);
        _bodyLabel.textColor = RGB(0xffffff);
        _fromLabel.textColor = RGB(0xffffff);
        _subjectLabel.textColor = RGB(0xffffff);
        _dateLabel.textColor = RGB(0xffffff);
    }
    else {
        self.contentView.backgroundColor = RGB(0xf7f7f7);;
        _bodyLabel.textColor = RGB(0xaaaaaa);
        _fromLabel.textColor = [UIColor blackColor];
        _subjectLabel.textColor = [UIColor blackColor];
        _dateLabel.textColor = RGB(0x496487);
    }
}

在 ViewWillAppear 我的 UITableViewController 类中添加了这个:

NSIndexPath *tableSelection = [self.tableView indexPathForSelectedRow];
SideSwipeTableViewCell *cell = (SideSwipeTableViewCell*)[self.tableView cellForRowAtIndexPath:tableSelection];
[cell highlightCell:NO];

在 didSelectRow 中添加了这个:

SideSwipeTableViewCell *cell = (SideSwipeTableViewCell*)[self.tableView cellForRowAtIndexPath:indexPath];
[cell highlightCell:YES];
于 2013-01-14T13:55:19.917 回答
6

我在以下方面很幸运:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    bool isSelected = // enter your own code here
    if (isSelected)
    {
        [cell setBackgroundColor:[UIColor colorWithRed:1 green:1 blue:0.75 alpha:1]];
        [cell setAccessibilityTraits:UIAccessibilityTraitSelected];
    }
    else
    {
        [cell setBackgroundColor:[UIColor clearColor]];
        [cell setAccessibilityTraits:0];
    }
}
于 2010-03-10T16:27:36.700 回答
6

我能够通过创建一个子类UITableViewCell并实现 setSelected:animated: 方法来解决这个问题

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
    if(selected) {
        [self setSelectionStyle:UITableViewCellSelectionStyleNone];
        [self setBackgroundColor:[UIColor greenColor]];
    } else {
        [self setBackgroundColor:[UIColor whiteColor]];
    }
}

诀窍是设置

cell.selectionStyle = UITableViewCellSelectionStyleDefault;

在实现视图控制器中,然后在 tableViewCell 中将其设置为

[self setSelectionStyle:UITableViewCellSelectionStyleNone];

希望这可以帮助。:)

于 2014-07-14T16:06:40.610 回答
6

对于 iOS7+,如果您使用的是Interface Builder,则子类化您的单元并实现:

Objective-C

- (void)awakeFromNib {
    [super awakeFromNib];
    // Default Select background
    UIView *v = [[UIView alloc] init];
    v.backgroundColor = [UIColor redColor];
    self.selectedBackgroundView = v;
}

斯威夫特 2.2

override func awakeFromNib() {
    super.awakeFromNib()
    // Default Select background
    self.selectedBackgroundView = { view in
        view.backgroundColor = .redColor()
        return view
    }(UIView())
}
于 2015-12-10T19:09:15.750 回答
5

如果您只想删除灰色背景颜色,请执行以下操作:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
     [[tableView cellForRowAtIndexPath:indexPath] setSelectionStyle:UITableViewCellSelectionStyleNone];
}     
于 2013-10-27T12:18:05.673 回答
5

这与分组调用完美配合:实现自定义子类UITableViewCell

这将尊重角落等......

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    if(selected)
        [self setBackgroundColor:[UIColor colorWithRed:(245/255.0) green:(255/255.0) blue:(255/255.0) alpha:1]];
    else
        [self setBackgroundColor:[UIColor whiteColor]];

}
于 2013-07-17T20:20:41.747 回答
4

默认样式为灰色,如果以编程方式完成,它会破坏单元格的颜色。你可以这样做来避免这种情况。(在斯威夫特)
cell.selectionStyle = .None

于 2015-09-08T04:16:07.200 回答
3

查看Apple 的示例AdvancedTableViewCells代码。

您将需要使用复合单元格模式。

于 2011-04-20T08:58:19.830 回答
3

斯威夫特

let v = UIView()
    v.backgroundColor = self.darkerColor(color)
    cell?.selectedBackgroundView = v;

...

func darkerColor( color: UIColor) -> UIColor {
    var h = CGFloat(0)
    var s = CGFloat(0)
    var b = CGFloat(0)
    var a = CGFloat(0)
    let hueObtained = color.getHue(&h, saturation: &s, brightness: &b, alpha: &a)
    if hueObtained {
        return UIColor(hue: h, saturation: s, brightness: b * 0.75, alpha: a)
    }
    return color
}
于 2014-09-15T18:26:40.743 回答
3

为我工作

UIView *customColorView = [[UIView alloc] init];
    customColorView.backgroundColor = [UIColor colorWithRed:180/255.0 
                                                      green:138/255.0 
                                                       blue:171/255.0 
                                                      alpha:0.5];
    cell.selectedBackgroundView =  customColorView;
于 2016-05-17T07:23:45.157 回答
3

在 Swift 3 中,从照亮答案转换而来。

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)
    if(selected) {
        self.selectionStyle = .none
        self.backgroundColor = UIColor.green
    } else {
        self.backgroundColor = UIColor.blue
    }
}

(然而,只有在松开手指确认选择后,视图才会改变)

于 2016-10-05T09:28:20.953 回答
3

斯威夫特 5.3

在这里,我为单行做了没有为单元格创建类。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if let cell = tableView.cellForRow(at: indexPath) {
        cell.contentView.backgroundColor = #colorLiteral(red: 0.1411764771, green: 0.3960784376, blue: 0.5647059083, alpha: 1)
    }
}
override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    if let cell = tableView.cellForRow(at: indexPath) {
        cell.contentView.backgroundColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
    }
}
于 2020-08-07T07:14:38.027 回答
2
override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    if selected {
        self.contentView.backgroundColor = .black
    } else {
        self.contentView.backgroundColor = .white
    }
}
于 2017-11-15T21:09:07.277 回答
2

创建一个自定义 UITableViewCell。在您的自定义类中覆盖“setSelected”函数并更改contentView背景颜色。您还可以覆盖您的“setHighlighted”功能。

在斯威夫特:

class myTableViewCell: UITableViewCell {

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
        // Add your color here
        self.contentView.backgroundColor = UIColor.whiteColor()
    }

    override func setHighlighted(highlighted: Bool, animated: Bool) {
        // Add your color here
        self.contentView.backgroundColor = UIColor.whiteColor()
    }
}
于 2016-01-14T21:26:15.153 回答
2

Swift 3, 4, 5 选择单元格背景颜色

1)当用户单击单元格时仅更改突出显示的颜色:

1.1)内部细胞类:

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code

    let backgroundView = UIView()
    backgroundView.backgroundColor = UIColor.init(white: 1.0, alpha: 0.1)
    selectedBackgroundView = backgroundView
}

1.2)您使用自定义单元格的视图控制器

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)
}

2)如果您为选定的单元格设置颜色:

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)
    // Configure the view for the selected state

    if selected {
        self.backgroundColor = .darkGray
    } else {
        self.backgroundColor = .white
    }
}
于 2019-05-16T10:22:56.013 回答
1

这是在 Interface Builder 中(在 Storyboard 中)执行此操作的快速方法。将一个简单的 UIView 拖到 UITableView 的顶部,如下所示界面视图 将单元格的selectedBackgroundViewOutlet 连接到此视图。您甚至可以将多个单元的插座连接到这一视图。 细胞的出口

于 2014-09-24T20:04:36.310 回答
1

对于通过子类化并使用其默认设置颜色来(正确)UIAppearance适用于iOS 7(及更高版本?)的解决方案,请在此处查看我对类似问题的回答UITableViewCellselectedBackgroundView

于 2015-08-26T10:15:12.550 回答
1
- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
    cell.contentView.backgroundColor = [UIColor yellowColor];
}

- (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
    cell.contentView.backgroundColor = nil;
}
于 2016-04-05T05:53:06.490 回答
0
var last_selected:IndexPath!

在类中定义 last_selected:IndexPath

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath) as! Cell
    cell.contentView.backgroundColor = UIColor.lightGray
    cell.txt.textColor = UIColor.red

    if(last_selected != nil){
        //deselect
        let deselect_cell = tableView.cellForRow(at: last_selected) as! Cell
        deselect_cell.contentView.backgroundColor = UIColor.white
        deselect_cell.txt.textColor = UIColor.black
    }

    last_selected = indexPath
}
于 2019-08-20T12:37:34.143 回答
0

将 selection 属性设置为 None,确保 tableView 设置了“Single Selection”并在tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell委托方法中使用此方法:

extension UITableViewCell {
    func setSelectionColor(isSelected: Bool, selectionColor: UIColor, nonSelectionColor: UIColor) {
        contentView.backgroundColor = isSelected ? selectionColor : nonSelectionColor
    }
}
于 2019-11-16T21:50:58.573 回答
0

我最近遇到了一个更新到 Swift 5 的问题,其中表格视图会闪烁选择然后取消选择选定的单元格。我在这里尝试了几种解决方案,但都没有奏效。解决方案设置clearsSelectionOnViewWillAppear为 false。

我以前使用过 UIView 和 selectedBackgroundColor 属性,所以我一直使用这种方法。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  let cell = tableView.dequeueReusableCell(withIdentifier: "popoverCell", for: indexPath) as! PopoverCell

  let backgroundView = UIView()
  backgroundView.backgroundColor = Color.Blue
  cell.selectedBackgroundView = backgroundView
}

以下是我需要对 Swift 5 进行的更改。该属性clearsSelectionOnViewWillAppear是我的单元格取消选择的原因。第一次加载时需要进行以下选择。

override func viewDidLoad() {
  super.viewDidLoad()

  clearsSelectionOnViewWillAppear = false
  popoverTableView.selectRow(at: selectedIndexPath, animated: false, scrollPosition: .none)
}
于 2020-07-28T05:29:29.713 回答
0

SWIFT 5.X当 附件类型更改为单元格
时它也可以工作

extension UITableViewCell{
    var selectedBackgroundColor: UIColor?{
        set{
            let customColorView = UIView()
            customColorView.backgroundColor = newValue
            selectedBackgroundView = customColorView
        }
        get{
            return selectedBackgroundView?.backgroundColor
        }
    }
}

在 UIViewController 中使用如下...

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! myCell
    cell.selectedBackgroundColor = UIColor.lightGray
    return cell
  }
于 2020-05-26T12:04:47.937 回答
0

我已经尝试了上述答案中的每一个,但没有一个最适合我,

然后我研究了一种本地提供的方法,它工作正常。

首先,将 cellSelectionStyle 设置为 None,然后选择此解决方案。

func tableView(_ tableView: UITableView, willDeselectRowAt indexPath: IndexPath) -> IndexPath?
{   
    let cell = tableView.cellForRow(at: indexPath);

   //cell which is getting deselected, make whatever changes that are required to make it back normal        

    cell.backgroundColor = kNormalColor;

    return indexPath;
}

func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath?
{
    let cell = tableView.cellForRow(at: indexPath);

   //cell which is getting selected, make whatever changes that are required to make it selected        

    cell.backgroundColor = kSelectedColor;

    return indexPath;
}

这种方法优于其他方法的优点是:

  1. 它适用于多个单元格选择
  2. 您可以根据需要更改任何元素,不仅是给定单元格在被选中和取消选中时的背景颜色。
于 2016-11-22T12:57:49.697 回答