我有一个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;
}
问题是,渐变不会覆盖我的附件视图占用的空间:
你也可以在左上角看到它也没有弯曲。
如何让渐变占据整个单元格空间?
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;
}
然而,现在渐变显示如下:
编辑2 --------- 下面的Tarks建议,使用UIView中的渐变然后分配到单元格的背景给出了这个结果!
答案 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
属性。