如何使用swift IO9绘制半圆并基于一个值绘制角度并仅填充部分颜色

时间:2016-07-08 05:47:29

标签: swift ios9

我想绘制这样的两个半圆,如图所示(下面的一个)

enter image description here 一世 从几天开始尝试但没有得到任何东西 尝试了一些图表api和一些代码从stackoverflow绘制饼图,但他们需要编辑,我不知道Core Grahpics,因为我是这个新手 我正在研究xcode 7.3.1和IOS 9 我的问题是: - 如何绘制一个半圆,它取一个值并首先转换该值以获得其等效角度,然后绘制该角度的圆弧并填充该部分的颜色 或者给我一些帮助,我可以学习自己绘制它们 感谢

3 个答案:

答案 0 :(得分:10)

以下代码在XCode iOS Playground中运行。它创建一个自定义UIView类并绘制两个饼图。开始和结束角度以整圆的百分比指定。

您可以轻松扩展它以显示更多或更少的切片,具体取决于您拥有的数据。

drawRect方法创建一个从中心开始的bezier路径,然后添加一个弧段,最后关闭路径以便填充它。

import UIKit

class PieChart : UIView {

    override func drawRect(rect: CGRect) {

        drawSlice(rect, startPercent: 0, endPercent: 50, color: UIColor.greenColor())
        drawSlice(rect, startPercent: 50, endPercent: 75, color: UIColor.redColor())
    }

    private func drawSlice(rect: CGRect, startPercent: CGFloat, endPercent: CGFloat, color: UIColor) {
        let center = CGPoint(x: rect.origin.x + rect.width / 2, y: rect.origin.y + rect.height / 2)
        let radius = min(rect.width, rect.height) / 2
        let startAngle = startPercent / 100 * CGFloat(M_PI) * 2 - CGFloat(M_PI)
        let endAngle = endPercent / 100 * CGFloat(M_PI) * 2 - CGFloat(M_PI)
        let path = UIBezierPath()
        path.moveToPoint(center)
        path.addArcWithCenter(center, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: true)
        path.closePath()
        color.setFill()
        path.fill()
    }
}

let pieChart = PieChart(frame: CGRect(x: 0.0, y: 0.0, width: 300.0, height: 300.0))
pieChart.backgroundColor = UIColor.clearColor()

答案 1 :(得分:0)

我的问题已经解决了。

我们只需要在第一行做一点改动就像在图片的半圆中那样:

drawSlice(rect, startPercent: 0, endPercent: 50, color: UIColor.greenColor())
drawSlice(rect, startPercent: 0, endPercent: 25, color: UIColor.redColor())

答案 2 :(得分:0)

Codo在Swift 3中的代码:

import UIKit

class PieChart : UIView {

    override func draw(_ rect: CGRect) {

        drawSlice(rect, startPercent: 0, endPercent: 50, color: .green)
        drawSlice(rect, startPercent: 50, endPercent: 75, color: .red)
    }

    private func drawSlice(_ rect: CGRect, startPercent: CGFloat, endPercent: CGFloat, color: UIColor) {
        let center = CGPoint(x: rect.origin.x + rect.width / 2, y: rect.origin.y + rect.height / 2)
        let radius = min(rect.width, rect.height) / 2
        let startAngle = startPercent / 100 * CGFloat.pi * 2 - CGFloat.pi
        let endAngle = endPercent / 100 * CGFloat.pi * 2 - CGFloat.pi
        let path = UIBezierPath()
        path.move(to: center)
        path.addArc(withCenter: center, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: true)
        path.close()
        color.setFill()
        path.fill()
    }
}

let pieChart = PieChart(frame: CGRect(x: 0.0, y: 0.0, width: 300.0, height: 300.0))
pieChart.backgroundColor = UIColor.clear