You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用CGContext绘制指定样式填充圆?是否需借助图片实现?

解答:CGContext绘制指定样式圆的实现方案

Hey there! 针对你的问题,我们可以根据你需要的圆的样式复杂度来选择不同的实现方式,下面分情况详细说明:

一、基础样式圆:优先用Core Graphics API(比如fillEllipse(in:))

如果你的圆是纯色、带阴影、渐变、简单边框这类基础样式,直接用CGContext的原生API就完全够用,而且相比图片渲染,它的性能更好、灵活性更高(可以动态调整颜色、大小、阴影参数等)。

先修正你现有代码的小细节

你当前的代码里,CGRect(x: center.x, y: center.y, width: cursorSize, height: cursorSize)会让圆的左上角在center位置,而不是以center为圆心。需要调整rect的原点,让圆居中:

// 修正后的rect:以center为圆心
let rect = CGRect(x: center.x - cursorSize/2, y: center.y - cursorSize/2, width: cursorSize, height: cursorSize)

扩展基础样式的示例

比如要绘制带渐变填充+黑色边框的圆,可以这样写:

private func drawStyledCursor(inContext ctx: CGContext) {
    ctx.saveGState()
    let center = pointFrom(angle: currentAngle)
    let rect = CGRect(x: center.x - cursorSize/2, y: center.y - cursorSize/2, width: cursorSize, height: cursorSize)
    
    // 1. 设置阴影
    ctx.setShadow(offset: CGSize(width: 0, height: 0), blur: 3, color: cursorShadowColor.cgColor)
    
    // 2. 创建径向渐变
    let gradientColors = [UIColor.systemBlue.cgColor, UIColor.systemPurple.cgColor] as CFArray
    guard let gradient = CGGradient(colorsSpace: CGColorSpaceCreateDeviceRGB(),
                                   colors: gradientColors,
                                   locations: [0.0, 1.0]) else {
        ctx.restoreGState()
        return
    }
    let gradientCenter = CGPoint(x: rect.midX, y: rect.midY)
    let gradientRadius = min(rect.width, rect.height) / 2
    
    // 3. 绘制渐变圆
    ctx.drawRadialGradient(gradient,
                           startCenter: gradientCenter,
                           startRadius: 0,
                           endCenter: gradientCenter,
                           endRadius: gradientRadius,
                           options: .drawsBeforeStartLocation)
    
    // 4. 添加边框
    ctx.setStrokeColor(UIColor.black.cgColor)
    ctx.setLineWidth(2)
    ctx.strokeEllipse(in: rect)
    
    ctx.restoreGState()
}

二、复杂样式圆:使用图片绘制

如果你的圆有复杂纹理、多层精细特效、不规则图案(比如带有渐变纹理+镂空+反光的设计,用Core Graphics很难精准还原),这时候建议用预先设计好的图片来绘制,能保证和设计稿完全一致。

图片绘制的示例代码

private func drawImageCursor(inContext ctx: CGContext) {
    ctx.saveGState()
    let center = pointFrom(angle: currentAngle)
    let rect = CGRect(x: center.x - cursorSize/2, y: center.y - cursorSize/2, width: cursorSize, height: cursorSize)
    
    // 建议提前缓存图片,不要每次绘制都加载,避免性能损耗
    guard let cursorImage = UIImage(named: "custom_styled_cursor") else {
        ctx.restoreGState()
        return
    }
    
    // 绘制图片到指定rect
    cursorImage.draw(in: rect)
    
    // 如果需要额外添加阴影,也可以继续设置
    ctx.setShadow(offset: CGSize(width: 0, height: 0), blur: 3, color: cursorShadowColor.cgColor)
    
    ctx.restoreGState()
}

⚠️ 注意:要为图片准备@2x、@3x的分辨率版本,保证在不同设备上的清晰度,并且尽量提前加载缓存图片,避免重复IO操作影响性能。

总结选择建议

  • 👉 如果样式是纯色、渐变、阴影、边框这类可通过Core Graphics组合实现的效果,优先用fillEllipse(in:)或其他CGContext绘制API,性能更好、动态调整更方便。
  • 👉 如果样式复杂到用API难以精准复现,选择图片绘制,能保证视觉效果和设计完全一致。

内容的提问来源于stack exchange,提问作者kAiN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 11:22:53