首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用渐变颜色填充bezier路径

如何用渐变颜色填充bezier路径
EN

Stack Overflow用户
提问于 2017-01-03 06:22:44
回答 4查看 18.1K关注 0票数 20

我在自定义的UIBezierPath函数中有一个UIView draw(_ rect: CGRect)。我想用渐变颜色填充路径。请任何人指点我该怎么做。

我需要填充一个渐变颜色的剪辑,然后用黑色笔画路径。

因此,有一些帖子不能解决这个问题。例如,Swift: Gradient along a bezier path (using CALayers),这篇文章指导如何在UIView中绘制图层,而不是在UIBezierPath中。

注:我正在研制Swift-3

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-01-03 09:28:06

为了回答你的问题,

我的自定义UIBezierPath绘图(_ rect: CGRect)函数中有一个UIView。我想用渐变颜色填充路径。

假设你有一条椭圆形的道路,

代码语言:javascript
复制
let path = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: 100, height: 100))

要创建一个梯度,

代码语言:javascript
复制
let gradient = CAGradientLayer()
gradient.frame = path.bounds
gradient.colors = [UIColor.magenta.cgColor, UIColor.cyan.cgColor]

我们需要一个梯度掩膜层,

代码语言:javascript
复制
let shapeMask = CAShapeLayer()
shapeMask.path = path.cgPath

现在将此shapeLayer设置为mask of gradient层,并将其添加到view的层中作为subLayer

代码语言:javascript
复制
gradient.mask = shapeMask
yourCustomView.layer.addSublayer(gradient)

更新使用笔画创建基本层,并在创建渐变层之前添加。

代码语言:javascript
复制
let shape = CAShapeLayer()
shape.path = path.cgPath
shape.lineWidth = 2.0
shape.strokeColor = UIColor.black.cgColor
self.view.layer.addSublayer(shape)

let gradient = CAGradientLayer()
gradient.frame = path.bounds
gradient.colors = [UIColor.magenta.cgColor, UIColor.cyan.cgColor]

let shapeMask = CAShapeLayer()
shapeMask.path = path.cgPath
gradient.mask = shapeMask

self.view.layer.addSublayer(gradient)
票数 33
EN

Stack Overflow用户

发布于 2018-07-06 10:33:53

无需使用CALayer类,就可以在Core中直接这样做。使用bezierPath.addClip()将bezier路径设置为裁剪区域。任何后续的绘图命令都将被屏蔽到该区域。

我在我的一个项目中使用了这个包装函数:

代码语言:javascript
复制
func drawLinearGradient(inside path:UIBezierPath, start:CGPoint, end:CGPoint, colors:[UIColor])
{
    guard let ctx = UIGraphicsGetCurrentContext() else { return }

    ctx.saveGState()
    defer { ctx.restoreGState() } // clean up graphics state changes when the method returns

    path.addClip() // use the path as the clipping region

    let cgColors = colors.map({ $0.cgColor })
    guard let gradient = CGGradient(colorsSpace: nil, colors: cgColors as CFArray, locations: nil)
        else { return }

    ctx.drawLinearGradient(gradient, start: start, end: end, options: [])
}
票数 14
EN

Stack Overflow用户

发布于 2022-06-29 07:28:31

这里的其他答案似乎行不通(至少在较新的iOS版本中是这样吗?)

下面是一个正在创建的bezier路径和作为渐变笔画的笔画的工作示例,根据需要调整CGPoints和CGColors:

代码语言:javascript
复制
        CGPoint start = CGPointMake(300, 400);
        CGPoint end = CGPointMake(350, 400);
        CGPoint control = CGPointMake(300, 365);
        
        UIBezierPath *path = [UIBezierPath new];
        [path moveToPoint:start];
        [path addQuadCurveToPoint:end controlPoint:control];
        
        CAShapeLayer *shapeLayer = [CAShapeLayer new];
        shapeLayer.path = path.CGPath;
        shapeLayer.strokeColor = [UIColor whiteColor].CGColor;
        shapeLayer.fillColor = [UIColor clearColor].CGColor;
        shapeLayer.lineWidth = 2.0;
        //[self.view.layer addSublayer:shapeLayer];
        
        CGRect gradientBounds = CGRectMake(path.bounds.origin.x-shapeLayer.lineWidth, path.bounds.origin.y-shapeLayer.lineWidth, path.bounds.size.width+shapeLayer.lineWidth*2.0, path.bounds.size.height+shapeLayer.lineWidth*2.0);
        CAGradientLayer *gradientLayer = [CAGradientLayer new];
        gradientLayer.frame = gradientBounds;
        gradientLayer.bounds = gradientBounds;
        gradientLayer.colors = @[(id)[UIColor redColor].CGColor, (id)[UIColor blueColor].CGColor];
        gradientLayer.mask = shapeLayer;
        [self.view.layer addSublayer:gradientLayer];
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41437581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档