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

如何在Swift中基于变量参数使用贝塞尔曲线绘制两个半圆

Swift使用贝塞尔曲线绘制双半圆实现方案

你已经计算得到的InRadius(内半径)、OutRadius(外半径)、Grades(角度)三个参数可直接传入UIBezierPath的圆弧构造方法实现绘制,注意Swift中绘制用的是弧度单位,需要先做角度转弧度的换算。

1. 自定义双圆弧绘制视图

你可以通过继承UIView重写绘制方法实现自定义绘制逻辑,参考代码如下:

import UIKit

class DoubleArcView: UIView {
    // 对外暴露参数,赋值后自动触发重绘
    var inRadius: Double = 0 {
        didSet { setNeedsDisplay() }
    }
    var outRadius: Double = 0 {
        didSet { setNeedsDisplay() }
    }
    var grades: Double = 0 {
        didSet { setNeedsDisplay() }
    }
    
    override func draw(_ rect: CGRect) {
        super.draw(rect)
        // 取视图中心点作为圆弧的圆心
        let arcCenter = CGPoint(x: bounds.midX, y: bounds.midY)
        // 角度转弧度
        let endRadian = grades * .pi / 180
        // 可根据需求调整起始角度,默认0是从水平正右方向开始绘制
        let startRadian: Double = 0
        
        // 绘制外半径圆弧
        let outArcPath = UIBezierPath(arcCenter: arcCenter, radius: outRadius, startAngle: startRadian, endAngle: endRadian, clockwise: true)
        UIColor.red.setStroke()
        outArcPath.lineWidth = 2
        outArcPath.stroke()
        
        // 绘制内半径圆弧
        let inArcPath = UIBezierPath(arcCenter: arcCenter, radius: inRadius, startAngle: startRadian, endAngle: endRadian, clockwise: true)
        UIColor.blue.setStroke()
        inArcPath.lineWidth = 2
        inArcPath.stroke()
    }
}

2. 绑定到你的计算逻辑

在你原有计算参数的Calcular方法末尾,新增参数赋值逻辑即可触发绘制,参考代码如下:

@IBAction func Calcular(_ sender: Any) {
    let a = Double(dmenor.text!)
    let b = Double(DMayor.text!)
    let c = Double(Altura.text!)
    
    if a != nil && b != nil && c != nil{
        let h = Double(b! * c!) / (b! - a!)
        let l = Double(sqrt((b! * b! / 4) + (h * h)))
        let ñ = Double(h-c!)
        let i = Double(sqrt((a! * a! / 4) + (ñ * ñ)))
        let g = Double(b! * 180) / (l)

        InRadius.text  = String(format:"%.1f", i)
        OutRadius.text  = String(format:"%.1f", l)
        Grades.text  = String(format:"%.1f", g)
        
        // 新增:给自定义绘制视图赋值触发重绘
        guard let inR = Double(InRadius.text!),
              let outR = Double(OutRadius.text!),
              let grade = Double(Grades.text!) else { return }
        // 此处doubleArcView是你提前创建的DoubleArcView实例
        doubleArcView.inRadius = inR
        doubleArcView.outRadius = outR
        doubleArcView.grades = grade
    }
}

常见调整说明

  • 如果需要圆弧从正上方开始绘制,将代码中的startRadian设置为-.pi / 2即可
  • 可以自行修改lineWidth(线宽)、UIColor(绘制颜色)参数适配你的UI需求
  • 若需要填充两个圆弧之间的区域形成扇形环,可将两条弧的端点用直线连接后调用fill()方法实现填充
  • 确保自定义绘制视图的宽高大于2倍外半径,避免圆弧超出视图范围被裁剪

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:15:05