在UIBezierPath中渲染渐变

时间:2013-05-21 10:33:45

标签: core-graphics uibezierpath

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

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

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

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

1 个答案:

答案 0 :(得分:0)

此包装函数在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对象,以提高图形系统加快将来渲染速度的机会。