ios - 用渐变描边画一个圆

标签 ios swift core-graphics cagradientlayer

我正在执行一项任务,我必须创建一个没有填充但有渐变描边的圆。作为引用,这是我追求的最终结果;

Circle with gradient stroke

考虑到该应用程序出现的其他情况,我正在这样画我的圆圈;

let c = UIGraphicsGetCurrentContext()!
c.saveGState()
let clipPath: CGPath = UIBezierPath(roundedRect: converted_rect, cornerRadius: converted_rect.width / 2).cgPath
c.addPath(clipPath)
c.setLineWidth(9.0)
c.setStrokeColor(UIColor.blue.cgColor)
c.closePath()
c.strokePath()
c.restoreGState()
let result = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

这会产生一个带有蓝色描边的圆圈。尽管围绕 SO 进行了很多搜索,但我仍在努力弄清楚如何用渐变而不是蓝色替换 setStrokeColor。我最成功的方法是创建一个 CAGradientLayer,然后使用从路径创建的 CAShapeLayer 对其进行 mask ,但我只能创建一个实心圆,而不是一个空心圆。

谢谢!

最佳答案

基本思路是使用你的路径作为剪切路径,然后绘制渐变。

let c = UIGraphicsGetCurrentContext()!
let clipPath: CGPath = UIBezierPath(ovalIn: converted_rect).cgPath

c.saveGState()
c.setLineWidth(9.0)
c.addPath(clipPath)
c.replacePathWithStrokedPath()
c.clip()

// Draw gradient
let colors = [UIColor.blue.cgColor, UIColor.red.cgColor]
let offsets = [ CGFloat(0.0), CGFloat(1.0) ]
let grad = CGGradient(colorsSpace: CGColorSpaceCreateDeviceRGB(), colors: colors as CFArray, locations: offsets)
let start = converted_rect.origin
let end = CGPoint(x: converted_rect.maxX, y: converted_rect.maxY)
c.drawLinearGradient(grad!, start: start, end: end, options: [])

c.restoreGState()

let result = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

首先使用所需的颜色设置一个CGGradient。然后对于线性渐变,您可以使用 drawLinearGradient。对于径向渐变,使用 drawRadialGradient

关于ios - 用渐变描边画一个圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45663087/

相关文章:

ios - Protocol 只能作为泛型约束,因为它有 Self 或 associatedType 要求

objective-c - UIView HitTest :withEvent: and pointInside:withEvent

ios - 在 iOS 中绘制一个半透明的矩形

ios - 无法找到或生成匹配的签名 Assets -Xcode 6.3

ios - Xcode iOS 通用应用程序图像大小

arrays - iOS - 字典中的顺序问题

ios - Swift 中的左对齐垂直 UILabel

ios - 无法获取非方形图像的字节

iphone - 为什么我看不到 iPod 的任何控制台日志?

jquery - APP升级IOS后imageURI发生变化