35

我正在开发一个 iPhone 应用程序,在我的表格视图中,我想要单元格选择样式的自定义颜色,我阅读了UITableViewCell 类参考,但是为选择样式定义了三个常量(蓝色、灰色、无)。我看到一个应用程序使用了与参考中定义的颜色不同的颜色。

我们如何使用参考中定义的颜色以外的颜色?

提前致谢。

4

9 回答 9

64

设置选择的最佳方法是selectedBackgroundView在构建单元格时设置它。

IE

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
        cell.selectedBackgroundView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SelectedCellBackground.png"]] autorelease];
    }

    // configure the cell
}

使用的图像应该有一个很好的渐变(如默认选择)。如果你只想要一个平面颜色,你可以使用 UIView 而不是 aUIImageView并将 设置为backgroundColor你想要的颜色。

然后在选择行时自动应用此背景。

于 2009-04-16T23:52:28.577 回答
24

当设置为时,设置selectedBackgroundView似乎没有效果。当我不设置样式时,只使用默认的灰色。 cell.selectionStyleUITableViewCellSelectionStyleNone

使用将自定义插入单元格的第一个建议UIView确实会操纵单元格,但是当单元格被触摸时它不会显示,只有在选定的操作完成后才显示,因为我正在推动新视图,所以为时已晚。如何在选定操作开始之前显示单元格中的选定视图?

于 2009-12-04T01:05:26.337 回答
13

如果您已将 UITableViewCell 子类化,则可以通过覆盖以下内容来自定义单元格的各种元素:

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    if(highlighted) {
        self.backgroundColor = [UIColor redColor];
    } else {
        self.backgroundColor = [UIColor clearColor];
    }

    [super setHighlighted:highlighted animated:animated];
}

iOS7 的编辑:正如 Sasho 所说,你还需要

cell.selectionStyle = UITableViewCellSelectionStyleNone
于 2012-07-24T14:34:33.493 回答
7

我尝试了上面的一些方法,实际上我更喜欢创建自己的 UITableViewCell 子类,然后覆盖 touchesBegan/touchesCancelled/touchesEnded 方法。为此,请忽略单元格上的所有 selectedBackgroundView 和 highlightColor 属性,而是在调用上述方法之一时手动设置这些颜色。例如,如果您想将单元格设置为具有红色文本的绿色背景,请尝试以下操作(在您的自定义单元格子类中):

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //Set backgorund
    self.backgroundColor = [UIColor themeBlue];

    //Set text
    self.textLabel.textColor = [UIColor themeWhite];

    //Call super
    [super touchesBegan:touches withEvent:event];
}

请注意,要使其正常工作,您需要设置:

self.selectionStyle = UITableViewCellSelectionStyleNone;

否则,您将首先获得当前的选择样式。

编辑:我建议使用 touchesCancelled 方法恢复到原始单元格颜色,但忽略 touchesEnded 方法。

于 2012-07-22T12:02:16.180 回答
2

覆盖 didSelectRowAtIndexPath: 并绘制您选择的颜色的 UIView 并将其插入单元格内的 UILabel 后面。我会这样做:

UIView* selectedView; //inside your header

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

  UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
  selectedView = [[UIView alloc] initWithFrame:[cell frame]];
  selectedView.backgroundColor = [UIColor greenColor]; //whatever

  [cell insertSubview:selectedView atIndex:0]; //tweak this as necessary
  [selectedView release]; //clean up

}

您可以选择在取消选择此视图时对其进行动画处理并满足您的要求。

于 2008-11-04T02:56:11.427 回答
1

子类 UITableViewCell 和覆盖setHighlighted:animated:

您可以通过设置 backgroundColor 来定义自定义选择颜色颜色(请参阅 WIllster 的答案):

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    if(highlighted) {
        self.backgroundColor = [UIColor redColor];
    } else {
        self.backgroundColor = [UIColor clearColor];
    }

    [super setHighlighted:highlighted animated:animated];
}

您可以通过设置 backgroundView 属性来定义自定义背景图像:

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
    if( highlighted == YES )
        self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"seasonal_list_event_bar_default.png"]];
    else
        self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"seasonal_list_event_bar_active.png"]];


    [super setHighlighted:highlighted animated:animated];
}
于 2012-10-25T14:31:56.260 回答
0
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {  
// Set Highlighted Color  
if (highlighted) {  
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-04T11:59:11.007 回答
0
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    return YES;
}

- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    // Add your Colour.
    SocialTableViewCell *cell = (SocialTableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
    [self setCellColor:Ripple_Colour ForCell:cell];  //highlight colour
}

- (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    // Reset Colour.
    SocialTableViewCell *cell = (SocialTableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
    [self setCellColor:Ripple_Colour ForCell:cell]; //normal color

}

- (void)setCellColor:(UIColor *)color ForCell:(UITableViewCell *)cell {
    cell.contentView.backgroundColor = color;
    cell.backgroundColor = color;
}
于 2016-06-29T12:58:18.160 回答
0

要添加自定义颜色,请使用以下代码。并使其透明使用alpha: 0.0

cell.selectedBackgroundView = UIView(frame: CGRect.zero)
cell.selectedBackgroundView?.backgroundColor = UIColor(red:0.27, green:0.71, blue:0.73, alpha:1.0)

如果您使用自定义颜色并希望给它圆角外观,请使用:

cell.layer.cornerRadius = 8

此外,使用它以获得更好的动画和感觉

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    tableView.deselectRow(at: indexPath, animated: true)
}
于 2018-02-05T13:25:40.913 回答