微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在swift中创建饼图

我正在尝试在 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] 举报,一经查实,本站将立刻删除。

相关推荐