我正在尝试在
swift中创建一个饼图,并希望从头开始创建代码,而不是使用第三方扩展.
我喜欢它是@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函数中包含数据?
提前致谢!
解决方法
您可以创建一个包含数据的便利初始化,但这只有在您从代码创建视图时才有用.如果您的视图已添加到故事板中,您将需要一种在创建视图后设置数据的方法.
查看设计线索的标准UI元素(如UIButton)是很好的.您可以更改UIButton上的属性并更新它,而无需调用myButton.setNeedsdisplay(),因此您应该设计饼图以相同的方式工作.
拥有包含数据的视图属性是很好的.视图应该负责重绘自身,因此为数据属性定义didSet并在那里调用setNeedsdisplay().
var data: Dictionary<String,Int>? { didSet { // Data changed. Redraw the view. self.setNeedsdisplay() } }
然后你可以简单地设置数据,饼图将重绘:
pieChart.data = pieData
您可以将其扩展到饼图上的其他属性.例如,您可能想要更改背景颜色.您还要为该属性定义didSet并调用setNeedsdisplay.
请注意,setNeedsdisplay只是设置一个标志,稍后将绘制视图.多次调用setNeedsdisplay不会导致您的视图重绘多次,因此您可以执行以下操作:
pieChart.data = pieData pieChart.backgroundColor = .redColor() pieChart.draw3D = true // draw the pie chart in 3D
并且pieChart只会重绘一次.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。