在 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 中渲染渐变的主要内容,如果未能解决你的问题,请参考以下文章