4

我有一个带有圆角和阴影的 UIView,已实现且可以正常工作。但是 UIView 有一个无聊的背景颜色,白色。所以我想放一个渐变层作为背景。在标签、按钮和最重要的下方,使圆角仍然出现。

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = subHudView.bounds;
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil];
[subHudView.layer addSublayer:gradient];
subHudView.layer.cornerRadius = 8;
subHudView.layer.masksToBounds = NO;
subHudView.layer.shadowOffset = CGSizeMake(-5, 5);
subHudView.layer.shadowRadius = 8;
subHudView.layer.shadowOpacity = 0.75;

这是我尝试实现它的代码,但渐变层位于视图中的所有内容之上。如何使渐变在所有控件和标签下?每一个响应的帮助将不胜感激。

4

5 回答 5

9

在斯威夫特:

let gradientLayer = CAGradientLayer()
gradientLayer.cornerRadius = 20.0
于 2018-11-26T14:41:06.470 回答
2

添加到视图 ( addSublayer) 的层被绘制在视图自己的层之前,这是所有视图的绘制发生的地方。您想要的是将渐变绘制到视图自己的图层中。为此,请+layerClass在您的视图中实现,指定您希望视图的图层为渐变视图。

因此,例如(在视图自己的代码中):

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

-(void)awakeFromNib {
    [super awakeFromNib];
    CAGradientLayer* layer = (CAGradientLayer*)self.layer;
    layer.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil];
    layer.cornerRadius = 8;
    layer.masksToBounds = NO;
    layer.shadowOffset = CGSizeMake(-5, 5);
    layer.shadowRadius = 8;
    layer.shadowOpacity = 0.75;
}

但是,如果您随后实现 drawRect:,您当然会消除渐变和圆角。有办法解决这个问题......

于 2011-11-25T19:06:14.403 回答
1

当您addSublayer:将图层添加到所有子图层的顶部时。

您可能应该使用类似的东西:

[subHudView.layer insertSublayer:gradient atIndex:0];

这样,CAGradientLayer将低于其他一切。

于 2011-11-25T19:01:44.307 回答
0

除了 gcamp 建议的 insertSublayer:atIndex: 之外,您还可以使用 insertSublayer:above: 和 insertSublayer:below: 将图层放置在特定位置。

[self.view.layer insertSublayer:gradient below:someUIObject];
于 2011-11-25T19:06:50.070 回答
0

不要创建新层,而是覆盖视图的 layer 方法:

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

这将确保您的视图创建一个 CAGradientLayer,而不是一个基本的 CALayer,作为基础层。

然后,在初始化期间获取层:

CAGradientLayer *gradLayer = self.layer;
gradLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil];

并将您的渐变分配给它。

又好又干净...

于 2011-11-25T19:57:46.537 回答