CAGradientLayer无法正确绘制渐变

时间:2016-06-11 07:48:23

标签: ios objective-c cagradientlayer

我使用CAShapeLayer绘制一个圆圈并将其设置为CAGradientLayer的掩码,这里是代码:

CAShapeLayer *circleShapeLayer = [CAShapelayer new];
// draw circle path code here...

CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.colors = @[(__bridge id)[UIColor whiteColor].CGColor,
                         (__bridge id)[UIColor clearColor].CGColor];
// self here means a UIView
gradientLayer.mask = circleShapeLayer;
gradientLayer.frame = self.bounds;
[self.layer addSublayer:gradientLayer];

当我运行应用程序时,它会显示一个渐变圆,但渐变很奇怪。

我想要的是一个圆圈,在起点,颜色是白色,在终点颜色是清晰的颜色,它应该是这样的:

enter image description here

但模拟器屏幕中圆圈的颜色为:

enter image description here

颜色是对称的。

我认为问题是我没有正确设置gradientLayer.colors,我该如何解决?

3 个答案:

答案 0 :(得分:1)

CAGradientLayer无法沿弧线绘制渐变。另一方面,掩模层的框架比渐变层的框架太小,看不到清晰的颜色

答案 1 :(得分:0)

对于Umair的回复,起初对我没有意义,因为即使whiteColorblackColorcolorWithRed:green:blue:alpha提取,但我在文档中读到了这一点:

  

渲染时,颜色会在插入之前映射到输出颜色空间。

所以也许这就是它:

gradientLayer.colors = @[(__bridge id)[UIColor colorWithRed:1.0f green:1.0f blue:1.0f alpha:1.0f].CGColor,
                         (__bridge id)[UIColor colorWithRed:1.0f green:1.0f blue:1.0f alpha:0.0f].CGColor];

答案 2 :(得分:0)

@ J.Hunter的answer是正确的,因为CAGradientLayer s不能沿着弧线绘制。这意味着您绘制的渐变将仅限于 radial linear 。您特别希望创建一个 angled 渐变,这也是我过去尝试过的。

不幸的是,CAGradientLayer受到这些限制的约束,我发现创建蒙版角度渐变的最佳方法是使用包含有角度渐变的UIImage进行遮罩。这不会像绘制自己的渐变那样动态,但它似乎是目前最好的(可能是唯一的)选项。