自定义UITableViewCell选择样式?


82

当我单击UITableViewCell时,单击单元格时,背景部分(背景图像未覆盖的区域)变为蓝色。另外,UILabel单击该单元格上的所有s都会变成白色,这正是我想要的。

但是,我不希望单击的是蓝色背景,但是如果单击selectionstylenone,则会丢失UILabel单元格中s的突出显示颜色。

那么,有什么方法可以在单击单元格时摆脱蓝色背景,而保持UILabels的突出显示颜色吗?


Answers:


174

您可以按照以下步骤进行操作。将表格单元格的选择样式设置为UITableViewCellSelectionStyleNone。这将删除蓝色背景突出显示。然后,要使文本标签突出显示为所需的方式,而不是使用默认的UITableViewCell类,请创建的子类UITableViewCellsetHighlighted:animated使用自己的实现覆盖默认的实现,该实现将标签颜色设置为所需的颜色,具体取决于突出显示的状态。

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
    if (highlighted) {
        self.textLabel.textColor = [UIColor whiteColor];
    } else {
        self.textLabel.textColor = [UIColor blackColor];
    }
}

11
作为一个侧面说明,请确保您覆盖setHighlighted:animated:,这需要的animated参数。覆盖单参数setHighlighted:方法将不起作用。
ImreKelényi13年

14
我们应该打电话[super setHighlighted:highlighted animated:animated];吗?
SoftDesigner 2014年

非常感谢!奇迹般有效!如果需要的话,这可以让我控制在单元格中突出显示另一个自定义视图,因为标准突出显示确实很奇怪。
imike 2014年

2
但是,当您覆盖setHighlighted和时,此方法存在一个问题setSelected。首先,你选择一个单元格,行的文字颜色改变为白色,然后您滚动该单元格您的屏幕可视部分,然后向后滚动,看到的,文字颜色变黑
罗南

1
@jonkroll我理解的概念,但我的要求是,当被选中单元格,然后该小区的为textLabel的颜色应保持为selectedColor,现在它只是改变为textLabel的颜色,而选择,在此之后,选定的textLabel保持原始颜色
Samarth Kejriwal

75

如果在iOS7之前运行,请设置您的单元格选择样式为无

cell.selectionStyle = UITableViewCellSelectionStyleNone;

别这样 UITableViewCellSelectionStyleDefault

然后:

UIView *selectedView = [[UIView alloc]init];
selectedView.backgroundColor = [UIColor redColor];
cell.selectedBackgroundView =  selectedView;

此代码将正常工作


2
@iBradApps ...在这里,您没有创建任何自定义类... ui表视图单元格
阿尔法

2
这给人一种给予好评-它只是为我工作改变所选单元格的非文本颜色的iOS 7的解决方案
韦恩詹森

1
selectionstyle应该为selectionStyle
braden

12
此解决方案可在iOS7上使用,但仅在将selectionStyle设置为UITableViewCellStyleDefault之后才能使用。
杰伊Q.

1
此方法是唯一与Apple的“开箱即用”单元格选择行为完全相同的方法。应该接受答案。
mkll 2014年

16

将选择样式设置为无后,可以使用以下委托方法:

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath

像这样在这里实现您的代码

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    CustomCell *cell = (CustomCell *)[tableView cellForRowAtIndexPath:indexPath];
    [cell.lbls setTextColor:[UIColor whiteColor]];
    return indexPath;
}

1
伟大而干净的解决方案!您只需要实现willDeselectRowAtIndexPath调用,它就可以像魔术一样工作!
MatejBalantič14年

1
可能的不利之处是,直到您的手指离开所选单元格时才调用此方法。触摸单元格后,其他一些方法即会生效。
2014年

14

为了完成这项工作,您必须将选择样式设置为UITableViewCellSelectionStyleNone,然后应该重写该方法setSelected:animated:以获得所需的结果。当您看到蓝色(或灰色)选择时,它的功能与iOS的自动选择机制相同。

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    if (selected) {
        self.textLabel.textColor = [UIColor whiteColor];
    } else {
        self.textLabel.textColor = [UIColor blackColor];
    }
}

您还可以通过其他方式自定义此设置,例如,通过更改UITableViewCell背景等。


13

在cellForRowAtIndexPath中使用以下代码:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

[cell.myLabel setHighlightedTextColor: [UIColor whiteColor]]; // for all your labels

希望这对您有用。

享受编码:)


这个答案必须放在首位。:)
Chintan Patel

2
这不会工作。如果要制作[cell.textLabel setHighlightedTextColor:[UIColor blueColor]]; 单元格selectionStyle不应为NONE。
Femina'1

6

在的子类中重写以下函数UITableViewCell

override func setHighlighted(highlighted: Bool, animated: Bool) { }
override func setSelected(selected: Bool, animated: Bool) { }

谢谢; 这是唯一在更改背景颜色时不会选择从屏幕左边缘到右边缘的整个行的代码。
何塞·拉米雷斯

我只是覆盖setSelected,这就是为什么由于某些原因该单元有时仍在闪烁。
Zonily Jame

3

为了匹配标准的选择样式行为,您将要同时覆盖setHighlighted:animated:setSelected:animated:。您可能需要将该代码移到共享方法中,以避免重复代码。

override func setHighlighted(highlighted: Bool, animated: Bool) {

    setAsSelectedOrHighlighted(highlighted, animated: animated)
    super.setHighlighted(highlighted, animated: animated)
}

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

    setAsSelectedOrHighlighted(selected, animated: animated)
    super.setSelected(selected, animated: animated)
}

func setAsSelectedOrHighlighted(selectedOrHighlighted: Bool, animated: Bool) {

    let action = {
        // Set animatable properties
    }

    if animated {
        UIView.animateWithDuration(1.0, delay: 0, options: .CurveEaseInOut, animations: action, completion: nil)
    }
    else {
        action()
    }
}

1

在您的自定义单元中,覆盖awakeFromNib和setSelected的默认实现:

- (void)awakeFromNib {
    // Initialization code
    UIImageView * imageView = [[UIImageView alloc] initWithFrame:self.bounds];
    imageView.image = [UIImage imageNamed:@"cell_selected_img"];
    self.selectedBackgroundView = imageView;
}

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

    // Configure the view for the selected state
    if (selected) {
        self.lblCustomText.textColor = [UIColor whiteColor];
    } else {
        self.lblCustomText.textColor = [UIColor blackColor];
    }
}

另外,还要确保选择的风格设置为


0

我可以使它工作的唯一方法是:

- (void)awakeFromNib {
    UIView *bgColorView = [[UIView alloc] init];
    bgColorView.backgroundColor = [UIColor colorWithRed:(55.0/255.0) green:(163.0/255.0) blue:(237.0/255.0) alpha:1.0];
    bgColorView.layer.masksToBounds = YES;
    self.selectedBackgroundView = bgColorView;
}

0

您也可以使用contentView.alpha。这是例子。

首先,为您的单元格设置选择样式:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

接下来,在自定义单元格类中用动画示例覆盖此方法:

  - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    [super setHighlighted:highlighted animated:animated];

    if (highlighted) {
        [UIView animateWithDuration:0.15f animations:^{
            self.contentView.alpha = 0.5f;
        }];
    } else {
        [UIView animateWithDuration:0.35f animations:^{
            self.contentView.alpha = 1.f;
        }];
    }
  }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.