将渐变图层添加到分组的UITableViewCell时,框架出现问题

时间:2012-12-15 08:52:46

标签: iphone objective-c ios uitableview

我有一个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;
}

问题是,渐变不会覆盖我的附件视图占用的空间: enter image description here

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

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

EDIT -----

如下所示,我已添加:

+(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;
}

然而,现在渐变显示如下: enter image description here

编辑2 --------- 下面的Tarks建议,使用UIView中的渐变然后分配到单元格的背景给出了这个结果! enter image description here

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

这可能在您的案例中作为解决方案:

使用资源/动态创建的渐变图像,并使用[UIColor colorWithPatternImage:gradientImage]设置细胞的backgroundColor属性。

如果要使用图层解决方案,则必须为渐变图层设置遮罩,但遮罩的形状取决于剖面中单元格的位置等等...

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

https://github.com/ole/OBGradientView

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