首页 文章

在CAShapeLayer图形下方绘制渐变

提问于
浏览
0

我正在使用应用于CAShapeLayer的CGPath绘制图形 . 图形本身被绘制得很好,但我想在之后添加一个渐变 . 我的问题是路径是从最后一个点到第一个点的直线关闭(见下文) - 这会使渐变填充看起来完全荒谬 .

enter image description here

据我所知,绕过这个问题的唯一方法是画两条额外的线:一条从图的最后一点到右下角,另一条线从左下角开始 . 这将很好地关闭路径,但它会为图形添加一个底线,我不想要 .

如果我使用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];

我希望你们能帮助我!

Update: 您建议我可以创建CAGradientLayer,然后将图层应用为其掩码 . 我没有给CAShapeLayer一个红色填充物 . 正如我所看到的,如果我将上层应用为CAGradientLayer的掩码,则某些渐变位于图形上方,有些则位于下方 . 我想要的是将所有渐变放置在图形的正下方 .

2 回答

  • 0

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

    弄清楚坐标的最小最大边界,创建一个大小的CAGradientLayer,然后根据需要配置它,然后将graphLayer应用为它的掩码 . 然后将新的CAGradientLayer添加到self.layer .

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

    这并没有考虑到中风,但如果这很重要,也应该不难应用 .

  • 0

    我通过创建两个单独的路径解决了这个问题:一个用于图形(如我的原始帖子所示),另一个从右下角开始,沿直线移动到左下角,然后从那里开始与图表相同的路径 . 通过这样做,路径很好地关闭,因为图形终止于与路径开始的相同的x坐标 .

    从那里,我将第二条路径应用于CAShapeLayer,然后将此图层用作渐变图层的蒙版 .

相关问题