饼图/情节在swift

时间:2015-02-27 15:26:16

标签: swift pie-chart

我尝试过很多不同的方法从GitHub添加绘图包或使用核心绘图或将objective-c结合到swift中,但在此过程中出现了很多问题,而在本周我没有'制作成功的图表。我真的很沮丧。

有没有人成功在swift中创建饼图?类似的问题似乎没有成功的答案。

我真的很感谢你的帮助!

3 个答案:

答案 0 :(得分:3)

不要沮丧。您只需添加更具体的问题即可获得更多帮助。例如,如果你从头开始并尝试集成来自Github的绘图包,你必须说明什么包,你是如何尝试整合它的,你得到的错误等等。

但是,使用CoreGraphics功能绘制简单的饼图非常简单。这是我的代码中的一个小礼物,它将进度值绘制为简单的黑白饼图。它只有2个部分,但你可以从中推广

@IBDesignable class ProgressPieIcon: UIView {
    @IBInspectable var progress : Double =  0.0 {
        didSet {
            self.setNeedsDisplay()
        }
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder:aDecoder)
        self.contentMode = .Redraw
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.backgroundColor = UIColor.clearColor()
        self.contentMode = .Redraw
    }

    override func drawRect(rect: CGRect) {
        let color = UIColor.blackColor().CGColor
        let lineWidth : CGFloat = 2.0

        // Calculate box with insets
        let margin: CGFloat = lineWidth
        let box0 = CGRectInset(self.bounds, margin, margin)
        let side : CGFloat = min(box0.width, box0.height)
        let box = CGRectMake((self.bounds.width-side)/2, (self.bounds.height-side)/2,side,side)


        let ctx = UIGraphicsGetCurrentContext()

        // Draw outline
        CGContextBeginPath(ctx)
        CGContextSetStrokeColorWithColor(ctx, color)
        CGContextSetLineWidth(ctx, lineWidth)
        CGContextAddEllipseInRect(ctx, box)
        CGContextClosePath(ctx)
        CGContextStrokePath(ctx)

        // Draw arc
        let delta : CGFloat = -CGFloat(M_PI_2)
        let radius : CGFloat = min(box.width, box.height)/2.0

        func prog_to_rad(p: Double) -> CGFloat {
            let rad = CGFloat(p * 2 * M_PI)
            return rad + delta
        }

        func draw_arc(s: CGFloat, e: CGFloat, color: CGColor) {
            CGContextBeginPath(ctx)
            CGContextMoveToPoint(ctx, box.midX, box.midY)
            CGContextSetFillColorWithColor(ctx, color)

            CGContextAddArc(
                ctx,
                box.midX,
                box.midY,
                radius-lineWidth/2,
                s,
                e,
                0)

            CGContextClosePath(ctx)
            CGContextFillPath(ctx)
        }

        if progress > 0 {
            let s = prog_to_rad(0)
            let e = prog_to_rad(min(1.0, progress))
            draw_arc(s, e, color)
        }
   }

答案 1 :(得分:0)

我们对Core Plot API进行了一些更改,包括将NSDecimal替换为NSDecimalNumber,以获得Swift兼容性。更改位于release-2.0分支上,而不是发布包中。有关该问题的更多讨论,请参阅Core Plot issue #96

答案 2 :(得分:-1)

您是否曾尝试使用Swift查找任何CorePlot教程?就像this one一样。

否则,您可能希望查看其他框架