Ios 在图层图下方绘制渐变

Ios 在图层图下方绘制渐变,ios,objective-c,cashapelayer,cgpath,Ios,Objective C,Cashapelayer,Cgpath,我正在使用应用于CAShapeLayer的CGPath绘制一个图形。图形本身绘制得很好,但是我想在它下面添加一个渐变。我的问题是,路径是用一条从最后一点到第一点的直线封闭的(见下文)——这会使渐变填充看起来非常可笑 就我所见,避免这个问题的唯一方法是再画两条线:一条从图表的最后一点到右下角,另一条从那里到左下角。这会很好地关闭路径,但会给图形添加一条底线,这是我不想要的 如果我使用CGContext,我可以通过将最后两行的笔划颜色更改为透明来轻松解决这个问题。然而,使用下面的代码,我不认为这是

我正在使用应用于CAShapeLayer的CGPath绘制一个图形。图形本身绘制得很好,但是我想在它下面添加一个渐变。我的问题是,路径是用一条从最后一点到第一点的直线封闭的(见下文)——这会使渐变填充看起来非常可笑

就我所见,避免这个问题的唯一方法是再画两条线:一条从图表的最后一点到右下角,另一条从那里到左下角。这会很好地关闭路径,但会给图形添加一条底线,这是我不想要的

如果我使用CGContext,我可以通过将最后两行的笔划颜色更改为透明来轻松解决这个问题。然而,使用下面的代码,我不认为这是可能的

CGMutablePathRef graphPath = CGPathCreateMutable();

for (NSUInteger i = 0; i < self.coordinates.count; i++) {
    CGPoint coordinate = [self.coordinates[i] CGPointValue];

    if (!i) {
        CGPathMoveToPoint(graphPath, NULL, coordinate.x, coordinate.y);
    } else {
        CGPathAddLineToPoint(graphPath, NULL, coordinate.x, coordinate.y);
    }
}

CAShapeLayer *graphLayer = [CAShapeLayer new];
graphLayer.path = graphPath;
graphLayer.strokeColor = [UIColor whiteColor].CGColor;
graphLayer.fillColor = [UIColor redColor].CGColor;

[self.layer addSublayer:graphLayer];
CGMutablePathRef graphPath=CGPathCreateMutable();
对于(整数i=0;i
我希望你们能帮助我


更新:您建议我创建一个CAGradientLayer,然后应用图形层作为其遮罩。但是,当图形/路径看起来像这样时,我不知道这将如何工作。我用另一张图替换了上面的图像,希望能更好地说明这个问题(注意,我给了CAShapeLayer一个红色填充)。如我所见,如果我将上面的图层作为CAGradientLayer的遮罩,一些渐变会位于图形上方,一些位于图形下方。我想要的是把所有的渐变都放在图形的正下方。

也许我没有正确理解这个问题,但是如果你想添加一个一致的渐变,你不能创建一个渐变层,然后让你的graphLayer成为该层的遮罩吗

找出坐标的最小-最大边界,创建一个大小相同的CAGradientLayer,按照您喜欢的方式进行配置,然后将graphLayer作为遮罩应用。然后将新的CAGradientLayer添加到self.layer

CAGradientLayer *gradientLayer = [CAGradientLayer layer];
// ... Configure the gradientLayer colors / locations / size / etc...
gradientLayer.mask = graphLayer;

[self.layer addSubLayer:gradientLayer];

这并没有考虑笔划,但如果这很重要的话,应用它应该也不难。

我通过创建两条独立的路径来解决这个问题:一条路径用于图形(如我原来的帖子所示),另一条路径从右下角开始,沿直线移动到左下角,从这里开始,遵循与图表相同的路径。通过这样做,路径可以很好地关闭,因为图形结束于与路径开始位置相同的x坐标


从那里,我将第二条路径应用于CAShapeLayer,然后将该层用作渐变层的遮罩。

下面是您的解决方案:您真的想要红色填充吗?或者你只是想让图形下方的区域填充渐变,而不是可见的对角线?@robmayoff我不想要红色填充,不;只是从图形线正下方开始的渐变。@Lefteris请查看我的更新。我认为你链接到的解决方案不适用于这个特定的问题。我已经用新的图片和更多的信息更新了我的帖子。