为分组的 UITableViewCell 自定义选择的背景颜色

Posted

技术标签:

【中文标题】为分组的 UITableViewCell 自定义选择的背景颜色【英文标题】:Custom Selected Background Color for Grouped UITableViewCell 【发布时间】:2011-04-05 23:19:24 【问题描述】:

有没有在分组的表格视图单元格上设置自定义选定背景颜色的好方法?我不想制作四张图像并跟踪哪一张适合哪个单元格。

我会使用UITableViewCellbackgroundViewselectedBackgroundView 属性,但它们破坏了分组表视图样式的圆角。

现在,我有一个 UITableViewCell 子类,它覆盖 -setHighlighted:animated:-setSelected:animated: 来切换单元格的 backgroundColor。这完美地工作,除了它不动画,即使backgroundColor 是一个动画属性,并且对它的更改在适当的时候包含在对-beginAnimations:context:-commitAnimations 的调用中。

【问题讨论】:

【参考方案1】:

您可能想看看 Matt Gallagher 的 TableDesignRevisited。我真的很喜欢他构建和管理 UITableViews 的方式。

我知道的用于更改分组表格视图单元格的选择样式的唯一其他解决方案是使用 4 个背景(顶部、底部、中间、顶部和底部)并根据表格中的单元格位置应用它们。

【讨论】:

我查看了 Matt Gallagher 的帖子,但他将有关其表格的信息传递给单元格,我真的不想这样做,即我正在寻找的“优雅”是一个单元格与位置无关。我最终为单元格的selectedBackgroundView 使用了CAShapeLayer-backed 视图,但我认为你是对的,实现这一目标的唯一方法是了解单元格是否位于顶部、底部、中间,或者是一个部分中的唯一单元格。【参考方案2】:

我设计了以下解决方案:

子类 UITableViewCell。定义选定和未选定单元格的背景颜色,例如:

#define SELECTED_BACKGROUND_COLOR [UIColor redColor]
#define NOT_SELECTED_BACKGROUND_COLOR [UIColor whiteColor]

(您也可以创建专门设计的属性)

然后,你必须重写 UITableViewCell 的两个方法。 我还介绍了简单的动画,因为正如@lemnar 所说, backgroundColor 属性是不可动画的。如果使用 NSTimers,动画可能会更好,但这会使代码更长。

- (void) mixBackgroundColorWithSelectedColorMultiplier:(NSNumber *)multiplier 

    CGFloat *selComponents = (CGFloat *) CGColorGetComponents(SELECTED_BACKGROUND_COLOR.CGColor);
    CGFloat *notSelComponents = (CGFloat *) CGColorGetComponents(NOT_SELECTED_BACKGROUND_COLOR.CGColor);

    if((CGColorGetNumberOfComponents(SELECTED_BACKGROUND_COLOR.CGColor) == 2)
    
        selComponents[2] = selComponents[1] = selComponents[0];
    

    if((CGColorGetNumberOfComponents(NOT_SELECTED_BACKGROUND_COLOR.CGColor) == 2)
    
        notSelComponents[2] = notSelComponents[1] = notSelComponents[0];
    

    CGFloat m = [multiplier floatValue];
    self.backgroundColor = [UIColor colorWithRed:(notSelComponents[0]) * (1.0 - m) + (selComponents[0]) * m
                                                                                 green:(notSelComponents[1]) * (1.0 - m) + (selComponents[1]) * m
                                                                                    blue:(notSelComponents[2]) * (1.0 - m) + (selComponents[2]) * m
                                                                                 alpha:1.0];
    [self setNeedsDisplay];


- (void) setSelected:(BOOL)selected animated:(BOOL)animated 

    if(selected) 
    
        if(animated)
        
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.2] afterDelay:0.08];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.4] afterDelay:0.16];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.6] afterDelay:0.24];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.8] afterDelay:0.32];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:1.0] afterDelay:0.40];
        
        else
        
            [self mixBackgroundColorWithSelectedColorMultiplier:[NSNumber numberWithFloat:1.0]];
        
    
    else
    
        if(animated)
        
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.8] afterDelay:0.08];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.6] afterDelay:0.16];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.4] afterDelay:0.24];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.2] afterDelay:0.32];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.0] afterDelay:0.40];
        
        else
        
            [self mixBackgroundColorWithSelectedColorMultiplier:[NSNumber numberWithFloat:0.0]];
        
    
    [super setSelected:selected animated:animated];


- (void) setHighlighted:(BOOL)highlighted animated:(BOOL)animated 

    if(highlighted) 
    
        if(animated)
        
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.2] afterDelay:0.08];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.4] afterDelay:0.16];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.6] afterDelay:0.24];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.8] afterDelay:0.32];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:1.0] afterDelay:0.40];
        
        else
        
            [self mixBackgroundColorWithSelectedColorMultiplier:[NSNumber numberWithFloat:1.0]];
        
    
    else
    
        if(animated)
        
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.8] afterDelay:0.08];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.6] afterDelay:0.16];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.4] afterDelay:0.24];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.2] afterDelay:0.32];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.0] afterDelay:0.40];
        
        else
        
            [self mixBackgroundColorWithSelectedColorMultiplier:[NSNumber numberWithFloat:0.0]];
        
    
    [super setHighlighted:highlighted animated:animated];

【讨论】:

关于这个方法的一些反馈? 它不起作用并且第一个函数未编译(需要重构编译

以上是关于为分组的 UITableViewCell 自定义选择的背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

确定分组自定义单元格的 UITableViewCell 宽度的正确方法?

uitableviewcell 自定义背景问题

编辑自定义 UITableViewCell 时不出现插入/删除编辑控件

UITableViewCell未选中时如何将其背景视图设置为选中的背景?

自定义 UITableViewCell 背景,何时重新加载等

使用 UIButton 自定义 UITableViewCell:无法更改 UIImage