1

我有一个 UITableViewCell 子类,我添加了这样的叠加渐变:

-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {

        // add a layer that overlays the cell adding a subtle gradient effect
        _gradientLayer = [CAGradientLayer layer];
        _gradientLayer.frame = self.bounds;
        _gradientLayer.colors = @[(id)[[UIColor colorWithWhite:1.0f alpha:0.2f] CGColor],
                                  (id)[[UIColor colorWithWhite:1.0f alpha:0.1f] CGColor],
                                  (id)[[UIColor clearColor] CGColor],
                                  (id)[[UIColor colorWithWhite:0.0f alpha:0.1f] CGColor]];
        _gradientLayer.locations = @[@0.00f, @0.01f, @0.95f, @1.00f];
        [self.layer insertSublayer:_gradientLayer atIndex:0];
    }
    return self;
}
-(void) layoutSubviews {
    [super layoutSubviews];
    // ensure the gradient layers occupies the full bounds
    _gradientLayer.frame = self.contentView.frame;
}

问题是,渐变没有覆盖我的附件视图占用的空间: 在此处输入图像描述

您还可以在左上角看到它也没有弯曲。

如何让渐变占据整个单元格空间?

编辑 - - -

如下所示,我添加了:

+(Class)layerClass
{
    return [CAGradientLayer class];
}

并将单元格的 init 方法更改为:

-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        _gradientLayer = (CAGradientLayer*)self.layer;
        _gradientLayer.colors = @[(id)[[UIColor colorWithWhite:1.0f alpha:0.2f] CGColor],
                                  (id)[[UIColor colorWithWhite:1.0f alpha:0.1f] CGColor],
                                  (id)[[UIColor clearColor] CGColor],
                                  (id)[[UIColor colorWithWhite:0.0f alpha:0.1f] CGColor]];
        _gradientLayer.locations = @[@0.00f, @0.01f, @0.95f, @1.00f];
    }
    return self;
}

但是,现在渐变显示如下: 在此处输入图像描述

EDIT 2 --------- Tarks 下面的建议,在 UIView 中使用渐变然后分配给单元格的背景给出了这个结果! 在此处输入图像描述

4

4 回答 4

2

以不同的方式进行。在您的子类中覆盖该+layerClass方法:

+(Class)layerClass
{
    return [CAGradientLayer class];
}

这样,您的单元格的顶层将是渐变层。然后只需将您的投射self.layerCAGradientLayer并设置其颜色和位置。

于 2012-12-15T08:57:41.393 回答
1

在您的情况下,这可能是解决方案:

使用资产/动态创建的渐变图像并[UIColor colorWithPatternImage:gradientImage]用于设置backgroundColor单元格的属性。

如果你想使用你的图层解决方案,你必须为你的渐变图层设置一个蒙版,但是蒙版的形状取决于单元格在部分中的位置等等......

您应该避免在渐变中使用透明度/alpha,至少在您的示例中您不需要它。

于 2012-12-15T11:43:25.370 回答
0

我认为让这个工作的唯一方法是使用backgroundView单元格的属性。否则,您总是会遇到单元格边框和附件视图的问题。只需将渐变层包装在 UIView 中,然后将其设置为背景视图。如果你想偷懒,有人已经这样做了:

https://github.com/ole/OBGradientView

selectedBackgroundView如果您也希望将其设置为渐变,您还必须设置该属性。

于 2012-12-15T14:42:31.787 回答
0

附件和编辑视图被添加到内容视图之外——内容视图并不总是填充单元格。

将图层的框架设置为 self.bounds,而不是 self.contentView.frame。

于 2012-12-15T08:59:23.590 回答