快速创建饼图

Ben*_*Ben 5 initialization init pie-chart swift

我正在尝试快速创建饼图,并希望从头开始创建代码,而不是使用 3rd 方扩展。

我喜欢它是@IBDesignable 的想法,所以我从这个开始:

import Foundation
import UIKit

@IBDesignable class PieChart: UIView {

  var data:  Dictionary<String,Int>?

  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 fun drawRect(rect: CGRect) {
    // draw the chart in here
  }

}
Run Code Online (Sandbox Code Playgroud)

我不确定的是如何最好地将数据放入图表中。我应该有这样的事情:

@IBOutlet weak var pieChart: PieChart!
override func viewDidLoad() {
    pieChart.data = pieData
    pieChart.setNeedsDisplay()
}
Run Code Online (Sandbox Code Playgroud)

或者,还有更好的方法?想必是没有办法在init函数中包含数据吧?

提前致谢!

vac*_*ama 3

您可以创建一个包含数据的便捷 init,但这仅在您从代码创建视图时才有用。如果您的视图已添加到情节提要中,您将需要一种在创建视图后设置数据的方法。

最好查看标准 UI 元素(例如UIButton)以获取设计线索。您可以更改 a 的属性,UIButton并且它会更新,而无需调用myButton.setNeedsDisplay(),因此您应该将饼图设计为以相同的方式工作。

拥有保存数据的视图属性是很好的。视图应该负责重绘自身,因此定义didSet您的data属性并在那里调用setNeedsDisplay()

var data:  Dictionary<String,Int>? {
    didSet {
        // Data changed.  Redraw the view.
        self.setNeedsDisplay()
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以简单地设置数据,饼图就会重新绘制:

pieChart.data = pieData
Run Code Online (Sandbox Code Playgroud)

您可以将其扩展到饼图上的其他属性。例如,您可能想要更改背景颜色。您也可以定义didSet该属性并调用setNeedsDisplay.

请注意,setNeedsDisplay只需设置一个标志,视图将在稍后绘制。多次调用setNeedsDisplay不会导致您的视图多次重绘,因此您可以执行以下操作:

pieChart.data = pieData
pieChart.backgroundColor = .redColor()
pieChart.draw3D = true  // draw the pie chart in 3D
Run Code Online (Sandbox Code Playgroud)

并且饼图只会重绘一次。