swift - 快速创建饼图

标签 swift initialization pie-chart init

我正在尝试快速创建一个饼图,并且想从头开始创建代码而不是使用第 3 方扩展。

我喜欢它是@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
  }

}

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

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

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

提前致谢!

最佳答案

您可以创建一个包含数据的便利 init,但这只有在您从代码创建 View 时才有用。如果您的 View 被添加到 Storyboard 中,您将需要一种在创建 View 后设置数据的方法。

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

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

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

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

pieChart.data = pieData

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

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

pieChart.data = pieData
pieChart.backgroundColor = .redColor()
pieChart.draw3D = true  // draw the pie chart in 3D

饼图只会重绘一次。

关于swift - 快速创建饼图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33944446/

相关文章:

ios - 弹回上一个 ViewController 无法在警报错误消息上工作

c++ - 静态 C++ 映射初始化错误 C2552 : non-aggregates cannot be initialized with initializer list

variables - 在一行SAS中初始化多个变量

c# - 使用 3 个整数的值创建饼图

arrays - 数组在dispatch_barrier_sync上损坏

ios - 努力跨 Parse 类追加数组

java - 为什么java在使用未初始化变量时会区别对待类作用域和方法作用域?

Python Bokeh饼图颜色,如何更改

r - 如何使用 gganimate 获得完整而不是部分的饼图

ios - 快速读取 JSON 解析到 NSArray 时出现段错误