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函数中包含数据吧?
提前致谢!
您可以创建一个包含数据的便捷 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)
并且饼图只会重绘一次。
归档时间: |
|
查看次数: |
3876 次 |
最近记录: |