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

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

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

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

【问题讨论】:

    标签: iphone objective-c uitableview


    【解决方案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];
    }
    

    【讨论】:

    • 关于这个方法的一些反馈?
    • 它不起作用并且第一个函数未编译(需要重构编译
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2015-03-15
    • 2011-11-01
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    相关资源
    最近更新 更多