在 UIBezierPath 中渲染渐变

Posted

技术标签:

【中文标题】在 UIBezierPath 中渲染渐变【英文标题】:Rendering a gradient in a UIBezierPath 【发布时间】:2013-05-21 10:33:45 【问题描述】:

如何,是否可以将此状态与 bezierPath 一起存储以便在 drawRect 中更快地重新渲染?

我目前在 drawRect 内渲染 bezierPaths,但无法添加渐变。

当我调用此方法CGContextDrawLinearGradient (ctx, gradient, gradientStartPoint, gradientEndPoint, 0); 时,我没有端点。

我尝试使用 BezierPath.currentPoint 但没有得到预期的结果。

【问题讨论】:

【参考方案1】:

这个包装函数在 UIBezierPath (Swift 4) 内渲染渐变:

func drawLinearGradient(inside path:UIBezierPath, start:CGPoint, end:CGPoint, colors:[UIColor])

    guard let ctx = UIGraphicsGetCurrentContext() else  return 

    ctx.saveGState()
    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: [])

    ctx.restoreGState() // remove the clipping region for future draw operations

在使用path.addClip() 设置剪切区域后,您可以更改它以呈现任何类型的渐变或其他绘图代码。

您可以缓存CGGradient 对象,以提高图形系统加速未来渲染通道的机会。

【讨论】:

以上是关于在 UIBezierPath 中渲染渐变的主要内容,如果未能解决你的问题,请参考以下文章

在 UIBezierPath 图上应用渐变层

UIBezierPath下绘制渐变

带有颜色渐变的 UIBezierPath

直接渲染一个CGImage(而不是UIImage)?

iOS绘画之UIBezierPath

iOS绘画之UIBezierPath