自定义UITableViewCell选择样式?

问题描述 投票:0回答:11

当我单击我的

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

但是,当我单击它时,我不想要蓝色背景,但如果我这样做

selectionstylenone
,那么我会丢失单元格中
UILabel
的突出显示颜色。

那么有什么方法可以在单击单元格时消除蓝色背景,但保留

UILabel
的突出显示颜色?

ios objective-c uitableview click selection
11个回答
179
投票

您可以按如下方式执行此操作。将表格单元格的选择样式设置为

UITableViewCellSelectionStyleNone
。这将删除蓝色背景突出显示。然后,为了使文本标签突出显示按照您想要的方式工作,不要使用默认的 UITableViewCell 类,而是创建
UITableViewCell
的子类,并使用您自己的实现覆盖
setHighlighted:animated
的默认实现,将标签颜色设置为您想要的颜色。想要取决于突出显示的状态。

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

77
投票

如果在 iOS7 之前工作,请将单元格选择样式设为无

cell.selectionStyle = UITableViewCellSelectionStyleNone;

不然就留下来

UITableViewCellSelectionStyleDefault

然后:

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

此代码可以正常工作


16
投票

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

-(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;
}

16
投票

要完成此工作,您必须将选择样式设置为

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 背景等


14
投票

在 cellForRowAtIndexPath 中使用以下代码:

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

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

希望这对您有用。

享受编码的乐趣:)


6
投票

重写

UITableViewCell
子类中的以下函数。

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

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];
    }
}

还要确保选择样式NOT设置为


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;
        }];
    }
  }

0
投票

要自定义单元格选择,您应该在 super.setSelected 调用之前进行,因为 super.setSelected 调用会影响 UITableViewCell 的单元格配置:

override func setSelected(_ selected: Bool, animated: Bool) {
  if selected {
     self.accessoryType = .checkmark
  } else {
     self.accessoryType = .none
  }
  super.setSelected(selected, animated: animated) 
}
© www.soinside.com 2019 - 2024. All rights reserved.