2

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

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

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

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

4

1 回答 1

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对象以提高图形系统加速未来渲染通道的机会。

于 2018-07-06T10:18:52.583 回答