我正在尝试快速创建一个饼图,并且想从头开始创建代码而不是使用第 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/