【问题标题】:Swift draw semicircle, not filled快速绘制半圆,未填充
【发布时间】:2018-06-29 11:04:17
【问题描述】:

我想我做错了什么,但我需要向你展示我的想法。我想画一个大约 180 度的半圆,它有三种不同的颜色。但我不希望它被填写,我只想让它成为圆圈本身。 我正在使用此代码:

func addCirc(colour: UIColor, perc: CGFloat) {
    let center = CGPoint(x: 150, y:150)
    let radius = min(200, 200) / 2
    let startAngle = 0 / 100 * CGFloat(Double.pi) * 2 - CGFloat(Double.pi)
    let endAngle = perc / 100 * CGFloat(Double.pi) * 2 - CGFloat(Double.pi)
    let path = UIBezierPath()
    path.move(to: center)
    path.addArc(withCenter: center, radius: CGFloat(radius), startAngle: startAngle, endAngle: endAngle, clockwise: true)
    colour.setStroke()
    path.close()
    path.lineWidth = 20
    path.stroke()
}

let leftColour = UIColor.red
let middleColour = UIColor.yellow
let rightColour = UIColor.green
addCirc(colour: rightColour, perc: 50)
addCirc(colour: middleColour, perc: 30)
addCirc(colour: leftColour, perc: 10)

结果如下所示:

所以我只想拥有圆本身并删除底线和对角线。我想在这种情况下使用 addArc 是错误的。 有人知道解决它的替代方法吗?

【问题讨论】:

    标签: swift draw


    【解决方案1】:

    我认为对path.close 的调用正在使所有这些直线出现。如果你只想要一条弧线而没有别的,为什么不试试初始化器init(arcCenter:radius:startAngle:endAngle:clockwise:)

    class MyView: UIView {
        override func draw(_ rect: CGRect) {
            let path = UIBezierPath(arcCenter: CGPoint(x: 100, y: 70), radius: 50, startAngle: -CGFloat.pi, endAngle: 0, clockwise: true)
            UIColor.black.setStroke()
            path.lineWidth = 10
            path.stroke()
        }
    }
    

    你可以创建这样的东西:

    如果您希望弧的不同部分具有不同的颜色,您可能需要记住弧的前一部分结束的角度(即将角度存储在变量中)。您目前似乎没有这样做。

    这是我能想到的:

    override func draw(_ rect: CGRect) {
        var lastArcAngle = -CGFloat.pi
        func addArc(color: UIColor, percentage: CGFloat) {
            let fullCircle = CGFloat.pi * 2
            let arcAngle = fullCircle * percentage
            let path = UIBezierPath(arcCenter: CGPoint(x: 100, y: 70), radius: 50, startAngle: lastArcAngle, endAngle: lastArcAngle + arcAngle, clockwise: true)
            color.setStroke()
            path.lineWidth = 10
            path.stroke()
            lastArcAngle += arcAngle
        }
        addArc(color: .red, percentage: 1.0 / 6.0)
        addArc(color: .green, percentage: 1.0 / 6.0)
        addArc(color: .blue, percentage: 1.0 / 6.0)
    }
    

    【讨论】:

    • 你说得对,谢谢! pathClose 并没有完全解决它,因为它还绘制了从圆心到圆开始的路。您的替代初始化程序有效,谢谢!关于上一条弧线的记忆:没错,我只是在上面的示例中没有这样做。
    • @FranzFerdinand 查看我尝试创建彩色半圆的编辑
    • 我只需要再问一个想法,这让我抓狂:我如何才能以最好的方式将其集中在自己的 UIView 上?所以我想替换(100,70)。 x 应该是 self.bounds.midX,但我正在努力寻找正确的 y。
    • 我可能只是对边界、框架、自我等感到困惑。
    • @FranzFerdinand 取决于您指的是哪个中心,(bounds.midX, bounds.midY)(bounds.midX, bounds.midY + radius / 2)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 2017-04-26
    相关资源
    最近更新 更多