Skip to content

0x072-SwifUI-Charts笔记1

Warning

This article is extracted from the chat log with AI. Please identify it with caution.

第一步:了解 SwiftUI Charts 的基础

在开始之前,确保你对 SwiftUI 有一定的了解,因为 SwiftUI Charts 是基于 SwiftUI 的。如果你还不熟悉 SwiftUI,建议先学习 SwiftUI 的基本概念,比如视图、状态管理、布局等。

1.1 什么是 SwiftUI Charts?

SwiftUI Charts 是 Apple 在 iOS 16(及以上版本)中引入的一个框架,用于创建各种类型的图表,比如折线图、柱状图、饼图等。它提供了声明式的 API,让开发者可以轻松地将数据可视化集成到应用程序中。

1.2 学习目标

在这一步,我们的目标是:

  • 了解 SwiftUI Charts 的基本用法。
  • 搭建一个简单的开发环境。
  • 创建你的第一个简单的图表。

1.3 设置开发环境

  1. 安装 Xcode:确保你已经安装了最新版本的 Xcode(至少是 Xcode 14,因为 SwiftUI Charts 是 iOS 16 引入的)。
  2. 创建一个新项目
    • 打开 Xcode,选择 “File” > “New” > “Project”。
    • 选择 “App” 模板,确保 Interface 选择 “SwiftUI”,Language 选择 “Swift”。
    • 设置项目名称,比如 “ChartsDemo”,然后点击 “Next” 保存项目。
  3. 检查目标 iOS 版本:确保你的项目目标是 iOS 16 或更高版本,因为 SwiftUI Charts 需要这个版本支持。

1.4 创建你的第一个图表

现在,我们来创建一个简单的柱状图(Bar Chart)作为起点。SwiftUI Charts 使用 Chart 视图来定义图表,数据通过 ChartData 协议提供。

  1. 打开 ContentView.swift 文件,替换默认代码为以下内容:
swift
import Charts
import SwiftUI

struct ChatzzView: View {
    var body: some View {
        Chart {
            BarMark(
                x: .value("Name", "Alice"),
                y: .value("Height (cm)", 165)
            )
            BarMark(
                x: .value("Name", "Bob"),
                y: .value("Height (cm)", 180)
            )
            BarMark(
                x: .value("Name", "Charlie"),
                y: .value("Height (cm)", 172)
            )
        }
        .frame(height: 300)
        .padding()
    }
}

#Preview {
    ChatzzView()
}
import Charts
import SwiftUI

struct ChatzzView: View {
    var body: some View {
        Chart {
            BarMark(
                x: .value("Name", "Alice"),
                y: .value("Height (cm)", 165)
            )
            BarMark(
                x: .value("Name", "Bob"),
                y: .value("Height (cm)", 180)
            )
            BarMark(
                x: .value("Name", "Charlie"),
                y: .value("Height (cm)", 172)
            )
        }
        .frame(height: 300)
        .padding()
    }
}

#Preview {
    ChatzzView()
}

  1. 运行项目(使用模拟器或真机),你会看到一个简单的柱状图,显示了三个类别(A、B、C)及其对应的值(50、30、70)。

1.5 理解代码

  • Chart:这是 SwiftUI Charts 的核心视图,用于定义一个图表。
  • BarMark:表示柱状图中的一个柱子,x 参数定义横轴的值(类别),y 参数定义纵轴的值(数值)。
  • .value:用于指定数据的标签和值,第一个参数是标签名,第二个参数是数据值。

Q&A

如何展示图例

可以使用.foregroundStyle(by: .value(..)) 的方式,例如:

swift
Chart {
	// 身高数据系列
	BarMark(
		x: .value("Name", "Alice"),
		y: .value("Height (cm)", 165)
	)
	.foregroundStyle(by: .value("Height", 165))
	BarMark(
		x: .value("Name", "Charlie"),
		y: .value("Height (cm)", 172)
	)
	.foregroundStyle(by: .value("Height", 172))
	BarMark(
		x: .value("Name", "Bob"),
		y: .value("Height (cm)", 180)
	)
	.foregroundStyle(by: .value("Height", 180))
}
// 确保图例可见
.chartLegend(.visible)
.frame(height: 350)
Chart {
	// 身高数据系列
	BarMark(
		x: .value("Name", "Alice"),
		y: .value("Height (cm)", 165)
	)
	.foregroundStyle(by: .value("Height", 165))
	BarMark(
		x: .value("Name", "Charlie"),
		y: .value("Height (cm)", 172)
	)
	.foregroundStyle(by: .value("Height", 172))
	BarMark(
		x: .value("Name", "Bob"),
		y: .value("Height (cm)", 180)
	)
	.foregroundStyle(by: .value("Height", 180))
}
// 确保图例可见
.chartLegend(.visible)
.frame(height: 350)

或者如下的方式,需要指定.foregroundStyle(.blue) 的颜色。

swift
.chartForegroundStyleScale(
	["Height": Color.blue, "Weight": Color.red])
// 确保图例可见
.chartLegend(.visible)
.chartForegroundStyleScale(
	["Height": Color.blue, "Weight": Color.red])
// 确保图例可见
.chartLegend(.visible)

示例:

swift
 struct ContentView: View {
    var body: some View {
        Chart {
            // 身高数据系列
            BarMark(
                x: .value("Name", "Alice"),
                y: .value("Height (cm)", 165)
            )
            .foregroundStyle(.blue)
                    
            BarMark(
                x: .value("Name", "Bob"),
                y: .value("Height (cm)", 180)
            )
            .foregroundStyle(.blue)
                    
            BarMark(
                x: .value("Name", "Charlie"),
                y: .value("Height (cm)", 172)
            )
            .foregroundStyle(.blue)
                    
            // 体重数据系列
            BarMark(
                x: .value("Name", "Alice"),
                y: .value("Weight (kg)", 55)
            )
            .foregroundStyle(.red)
                    
            BarMark(
                x: .value("Name", "Bob"),
                y: .value("Weight (kg)", 75)
            )
            .foregroundStyle(.red)
                    
            BarMark(
                x: .value("Name", "Charlie"),
                y: .value("Weight (kg)", 68)
            )
            .foregroundStyle(.red)
        }
        // 设置纵轴标题
        .chartYAxisLabel("Value")
        // 必须设置才能展示图例
        .chartForegroundStyleScale(
            ["Height": Color.blue, "Weight": Color.red])
        // 确保图例可见
        .chartLegend(.visible)
        // 增加图表高度以容纳图例
        .frame(height: 350)
        .padding()
    }
}
 struct ContentView: View {
    var body: some View {
        Chart {
            // 身高数据系列
            BarMark(
                x: .value("Name", "Alice"),
                y: .value("Height (cm)", 165)
            )
            .foregroundStyle(.blue)
                    
            BarMark(
                x: .value("Name", "Bob"),
                y: .value("Height (cm)", 180)
            )
            .foregroundStyle(.blue)
                    
            BarMark(
                x: .value("Name", "Charlie"),
                y: .value("Height (cm)", 172)
            )
            .foregroundStyle(.blue)
                    
            // 体重数据系列
            BarMark(
                x: .value("Name", "Alice"),
                y: .value("Weight (kg)", 55)
            )
            .foregroundStyle(.red)
                    
            BarMark(
                x: .value("Name", "Bob"),
                y: .value("Weight (kg)", 75)
            )
            .foregroundStyle(.red)
                    
            BarMark(
                x: .value("Name", "Charlie"),
                y: .value("Weight (kg)", 68)
            )
            .foregroundStyle(.red)
        }
        // 设置纵轴标题
        .chartYAxisLabel("Value")
        // 必须设置才能展示图例
        .chartForegroundStyleScale(
            ["Height": Color.blue, "Weight": Color.red])
        // 确保图例可见
        .chartLegend(.visible)
        // 增加图表高度以容纳图例
        .frame(height: 350)
        .padding()
    }
}

图例位置可以通过代码调整:

swift
.chartLegend(position:.topLeading)
.chartLegend(position:.topLeading)

柱状图顶部如何展示数字

添加annotation, 例如:

BarMark(
	x: .value("Name", "Bob"),
	y: .value("Height (cm)", 180)
)
.annotation(position: .top) {
	Text("180")
}
BarMark(
	x: .value("Name", "Bob"),
	y: .value("Height (cm)", 180)
)
.annotation(position: .top) {
	Text("180")
}