如何在Swift中创建漂亮的iOS图表

通过图形和图表呈现数据是当今移动应用程序最显着的特征之一。iOS图表使应用程序看起来更漂亮,更有吸引力。

在本教程中,我们将向您展示如何使用代码示例在Swift中实现我们的iOS图表。我们将看一下Swift折线图饼图以及条形图

您可以找到许多支持显示图表的库,其中一个是Daniel Cohen Gindi的图表。在本文中,我们将研究如何显示图表,有多少类型的图表以及如何自定义它们。

image

1.简介

目前,它已成为大多数健身应用程序或任何提供用户数据跟踪,检查和比较的企业应用程序的最突出功能之一。在表格或集体视图中显示数据可能很无聊,并提供有限的数据可视化功能。从那时起,在这些情况下,应该在iOS应用程序中集成图表。

根据我们的目的,我们选择哪种类型的Swift图表最适合我们的iOS功能:

条形图:当数据具有不同的类别并且需要比较时(例如,每月销售值),条形图提供了良好且直观的可视化。

饼图:当分类数据需要以百分比显示时,饼图(也称为圆图)将是一个不错的选择。每个图表总是代表整体,因此必须等于100%。

折线图:为了直观地表示某段时间内的变化,例如库存,没有比使用折线图更好的了。它显示最大和最小点,并显示公司的当前状态。

2. Swift中的iOS饼图

在本教程中,我们将构建一个iOS应用程序,显示玩家为其足球俱乐部贡献的目标百分比。正如您可能已经猜到的那样,在iOS本机应用程序中,Swift饼图将是可视化此类数据的最佳方式。

让我们开始吧。在这里下载Swift入门项目 并在Xcode中运行它。基本上,它有三个按钮对应于三种类型的图表中的每一种。当您点击任何按钮时,它会按下显示所需图表的屏幕。

像往常一样,我们需要安装依赖库,在本例中是Charts。您可以手动或通过Podfile(推荐 - 这是我们使用的)或Carthage下载它。我们更喜欢Podfile,因为它快速,整洁,干净。我们还已经创建了Podfile(带有pod图表),所以你只需要在终端中运行***pod**** install*命令。然后,让我们第一次运行Xcode项目。它看起来像这样:

image

第1步:设置UI和IBOutlets

通过使用Interface Builder,将View对象拖到故事板中。请记住使用自动布局为其设置约束。然后,在Identity检查器部分,从Charts模块中选择PieChartView

之后,我们需要将IBOutlet连接从屏幕上的View拖动到管理PieChartViewUIViewController。请记住导入Charts库以便成功编译代码。

第2步:创建模拟数据

接下来,我们将创建一个名为“ CommonData ” 的文件,其中包含玩家的名字以及他们各自的俱乐部目标数量。


let players = [“Ozil”, “Ramsey”, “Laca”, “Auba”, “Xhaka”, “Torreira”]

let goals = [6, 8, 26, 30, 8, 10]

然后,我们将创建一个显示所有这些数据的函数,并将其放在viewDidLoad()中,如下所示:


override func viewDidLoad() {

super.viewDidLoad()

customizeChart(dataPoints: players, values: goals.map{ Double($0) })

}

func customizeChart(dataPoints: [String], values: [Double]) {

// TO-DO: customize the chart here

}

这功能是customizeChart数据点值的参数。因为“values”参数是Double,所以我们需要将目标数组从Int类型更改为Double类型。现在我们需要做的是根据需要自定义图表。

第3步:自定义图表

在向您展示代码之前,我们想谈谈理论。您应该知道以下某些属性:

ChartDataEntry:此“ChartDataEntry”属性将存储我们需要在数组中表示的每个元素的值。

ChartDataSet:此ChartDataSet将使用ChartDataEntry对象数组中的信息来自定义如何在屏幕上显示它们。

ChartData:此ChartData将使用ChartDataSet作为图表的数据。

现在让我们看看它是如何工作的


func customizeChart(dataPoints: [String], values: [Double]) {

  // 1\. Set ChartDataEntry

  var dataEntries: [ChartDataEntry] = []

  for i in 0..<dataPoints.count {

    let dataEntry = PieChartDataEntry(value: values[i], label: dataPoints[i], data: dataPoints[i] as AnyObject)

    dataEntries.append(dataEntry)

  }


  // 2\. Set ChartDataSet

  let pieChartDataSet = PieChartDataSet(values: dataEntries, label: nil)

  pieChartDataSet.colors = colorsOfCharts(numbersOfColor: dataPoints.count)

  // 3\. Set ChartData

  let pieChartData = PieChartData(dataSet: pieChartDataSet)

  let format = NumberFormatter()

  format.numberStyle = .none

  let formatter = DefaultValueFormatter(formatter: format)

  pieChartData.setValueFormatter(formatter)

  // 4\. Assign it to the chart’s data

  pieChartView.data = pieChartData

}

我们来分析代码:

对于每个玩家和他拥有的目标,我们将其设置为PieChartDataEntry对象 - ChartDataEntry的子类。然后我们将它保存在PieChartDataEntry类型的数组中。

PieChartDataSet(ChartDataSet的子类)将使用此数组来自定义如何在屏幕上显示它们。例如,这行代码pieChartDataSet.colors将为每个部分设置颜色。

PieChartData-- ChartData的子类将存储PieChartDataSet。此时,您可以更改将在屏幕上显示的值的格式,例如15而不是15.0。

在完成所有设置之后,我们将pieChartData分配给pieChartView.data

此外,如果您具有每种特定颜色的设计并且您知道确切的条目数,则可以为它们创建和选择颜色。在这个应用程序中,我们将为它选择随机颜色,颜色数量取决于项目的数量。


private func colorsOfCharts(numbersOfColor: Int) -> [UIColor] {

  var colors: [UIColor] = []

  for _ in 0..<numbersOfColor {

    let red = Double(arc4random_uniform(256))

    let green = Double(arc4random_uniform(256))

    let blue = Double(arc4random_uniform(256))

    let color = UIColor(red: CGFloat(red/255), green: CGFloat(green/255), blue: CGFloat(blue/255), alpha: 1)

    colors.append(color)

  }

  return colors

}

现在,让我们看看我们的图表有多漂亮。

image

3.其他图表

正如我们在开始时所说,每个图表都有自己的优势。折线图和条形图可能不符合当前应用程序的要求。但是,我们仍然会创建这两个iOS图表,向您展示可以使用相同的简单步骤轻松创建它们。

a. Swift折线图

```

var dataEntries: [ChartDataEntry] = []

for i in 0..<dataPoints.count {

let dataEntry = ChartDataEntry(x: values[i], y: Double(i))

dataEntries.append(dataEntry)

}

let lineChartDataSet = LineChartDataSet(values: dataEntries, label: nil)

let lineChartData = LineChartData(dataSet: lineChartDataSet)

lineChartView.data = lineChartData


![image](https://upload-images.jianshu.io/upload_images/7887714-0555b35d48fde61c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

b. 条形图

var dataEntries: [BarChartDataEntry] = []

for i in 0..<dataPoints.count {

let dataEntry = BarChartDataEntry(x: Double(i), y: Double(values[i]))

dataEntries.append(dataEntry)

}

let chartDataSet = BarChartDataSet(values: dataEntries, label: “Bar Chart View”)

let chartData = BarChartData(dataSet: chartDataSet)

barChartView.data = chartData


![image](https://upload-images.jianshu.io/upload_images/7887714-7f973b5a03c86132.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

**4.结论和iOS图表挑战**

毕竟,我们希望本文提供**iOS ****图表**的清晰概述  。它们使您的移动应用程序更加美观和有吸引力 除核心功能外,还应优先考虑应用程序UI / UX  ,以提供更好的用户体验。

在我们完成本文之前,我们面临一些挑战:

这个库也有一些**触摸事件**,所以你可以尝试这个部分。

对于BarChartView,在*viewDidLoad()中*,我们留下了一些代码行作为奖励。你可以玩它们。

[这](https://github.com/DuyBui297/ChartsTutorial/tree/completed-project)是完成的Swift源代码。希望您学会了如何在Swift中构建iOS图表,这样您就可以使您的Xcode项目更具吸引力。我们希望您发现这个Swift教程很有用,所以请分享它以传播这个词。不要忘记做你的挑战。快乐的编码!
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 体验,感受,改变 让员工自己去体验,通过体验感受现状再去改变会更有效果。
    镇江吾悦DDM徐冰阅读 152评论 0 0
  • React 16.6.0 新特性 16.6.0版本发布于10.23号,下面就来看看他们带来了什么新特性吧: Rea...
    frozenRabbit阅读 210评论 0 0
  • 当云已飘远 花又凋零 叶落归根 倦鸟回巢 我是否还能等到你
    凡声尘语阅读 194评论 1 2
  • 我爱 我得 莫不是世界 沉吟至今 我是朝阳 看着远方,冰冷如故 蜚语沙沙 作响,我的耳朵默不作声 我是离肠一样的朝...
    Amaorent阿毛的空瓶子阅读 235评论 9 17