我有一个带有圆角和阴影的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;
这是我尝试实现它时的代码,但渐变层位于视图中的所有内容之上。如何使渐变位于所有控件和标签下?每个响应的帮助将不胜感激。
答案 0 :(得分: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:,那么你当然会消除你的渐变和圆角。有办法......
答案 1 :(得分:1)
当你addSublayer:
时,它会在所有子图层的顶部添加图层。
您应该使用类似的东西:
[subHudView.layer insertSublayer:gradient atIndex:0];
这样,CAGradientLayer
将低于其他所有内容。
答案 2 :(得分:1)
在Swift中:
let gradientLayer = CAGradientLayer()
gradientLayer.cornerRadius = 20.0
答案 3 :(得分:0)
除了insertSublayer:atIndex:gcamp建议,你也可以使用insertSublayer:above:和insertSublayer:below:将你的图层放在特定的地方。
[self.view.layer insertSublayer:gradient below:someUIObject];
答案 4 :(得分:0)
不是创建新图层,而是覆盖视图的图层方法:
+ (Class)layerClass
{
return [CAGradientLayer class];
}
这将确保您的视图创建CAGradientLayer而不是基本CALayer作为基础层。
然后,在init期间获取图层:
CAGradientLayer *gradLayer = self.layer;
gradLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil];
并将渐变分配给它。
干净整洁......