添加 CAGradientLayer 子层时,UITableViewCell 不拾取 UITableViewCellSelectionStyleBlue

Posted

技术标签:

【中文标题】添加 CAGradientLayer 子层时,UITableViewCell 不拾取 UITableViewCellSelectionStyleBlue【英文标题】:UITableViewCell doesn't pickup UITableViewCellSelectionStyleBlue when adding CAGradientLayer sublayer 【发布时间】:2011-07-21 22:34:56 【问题描述】:

我有一个 UITableViewCell,我使用 CAGradientLayer 添加了渐变。这工作正常,但表格单元格在选择时不会变成蓝色,即使在将其 selectionStyle 设置为 UITableViewCellSelectionStyleBlue 之后也是如此。如果我不添加渐变层,它可以正常工作。

有没有办法让这些项目协同工作?

这是我在 cellForRowAtIndexPath 中的代码:

    //cell gradient        
    CAGradientLayer *gradient = [CAGradientLayer layer];
    gradient.frame = CGRectMake(10, 0, 300, 50);
    gradient.colors = [NSArray arrayWithObjects:
                       (id)[[UIColor colorWithRed:255/255.0 green:255/255.0 blue:255/255.0 alpha:1] CGColor],
                       (id)[[UIColor colorWithRed:255/255.0 green:255/255.0 blue:255/255.0 alpha:1] CGColor],
                       (id)[[UIColor colorWithRed:245/255.0 green:245/255.0 blue:245/255.0 alpha:1] CGColor],
                       (id)[[UIColor colorWithRed:247/255.0 green:247/255.0 blue:247/255.0 alpha:1] CGColor],
                       nil];
    gradient.locations = [NSArray arrayWithObjects:
                          (id)[NSNumber numberWithFloat:0.00],
                          (id)[NSNumber numberWithFloat:0.50],
                          (id)[NSNumber numberWithFloat:0.51],
                          (id)[NSNumber numberWithFloat:1.0],                                                                                          
                          nil];
    [cell.layer insertSublayer:gradient atIndex:0];


    //bring back rounded corners by creating a masklayer 
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:gradient.bounds byRoundingCorners:UIRectCornerBottomRight|UIRectCornerBottomLeft cornerRadii:CGSizeMake(8, 8)];
    CAShapeLayer *maskLayer = [CAShapeLayer layer];
    maskLayer.frame = gradient.bounds;
    maskLayer.path = maskPath.CGPath;
    gradient.mask = maskLayer;

    //add the cell shadow
    cell.layer.shadowColor = [[UIColor blackColor] CGColor];
    cell.layer.shadowRadius = 3;
    cell.layer.shadowOpacity = 0.5;
    cell.layer.shadowOffset = CGSizeMake(0, 0);

    cell.selectionStyle = UITableViewCellSelectionStyleBlue;      

【问题讨论】:

【参考方案1】:

看起来您可能会将渐变放在选择时更改的视图上 - UITableViewCellSelectionStyleBlue 视图可能会出现,但您只是看不到它(测试它的一种方法是只有渐变覆盖部分您的单元格-如果其他部分在被选中时改变颜色,那么这就是问题所在)。

如果这是问题所在,那么您可以在选择单元格时通过子类化 UITableViewCell 为单元格进行自定义绘图,或者您可以在选择单元格时让渐变消失(并在取消选择单元格时重新出现)。

【讨论】:

就是这样。我将渐变的框架设置为一半宽,没有渐变的一半变成蓝色。我需要尝试删除 touchesBegan 中的渐变吗? 我不这么认为。我会继承 UITableViewCell 并在 init 方法中设置渐变,然后覆盖 setSelected:animated: 方法,如果 selected==true 则删除渐变,然后调用 [super setSelected:animated:] 让超类绘制蓝色渐变。 作为对此的跟进,我实际上想要 setHighlighted,而不是 setSelected。 setSelected 似乎比 setHighlighted 发生得晚得多,后者在触摸开始时发生。 setHighlighted 对我不起作用。我都试过了,setSelected 工作了。

以上是关于添加 CAGradientLayer 子层时,UITableViewCell 不拾取 UITableViewCellSelectionStyleBlue的主要内容,如果未能解决你的问题,请参考以下文章

为包含 CAGradientLayer 的 UIView 设置动画

动画视图的子视图不适用于 CAGradientLayer [关闭]

在动态大小的 UITableViewCell 上应用 CAGradientLayer

转换子图层时如何防止调用layoutSubviews?

如何向 ASDisplayNode 或 ASButtonNode 添加渐变

如何为图像添加渐变?