示例代码都放这里啦,有需要的可以下载学习。swiftUIDemo
3.1 文本显示:Text
Text 组件介绍
Text 是 SwiftUI 中最基本的视图组件,用于显示文本内容。它支持富文本、字体样式、颜色等多种属性。
基本用法
// 基本文本
Text("Hello, SwiftUI!")
// 带样式的文本
Text("Hello, SwiftUI!")
.font(.largeTitle) // 设置字体大小
.fontWeight(.bold) // 设置字重
.foregroundStyle(.blue) // 设置文本颜色
.italic() // 斜体
.underline() // 下划线
.strikethrough() // 删除线
富文本
// 富文本
Text("Hello, \(Text("SwiftUI").foregroundStyle(.blue).bold())!")
// 多行文本
Text("这是一段多行文本,\n可以通过反斜杠 n 来换行,\n或者直接在字符串中换行。")
.multilineTextAlignment(.center) // 多行文本对齐方式
.lineLimit(3) // 限制行数
.truncationMode(.tail) // 截断方式
本地化
// 本地化文本
Text("welcome_message") // 从 Localizable.strings 文件中读取
// 带参数的本地化
Text("greeting", comment: "欢迎语")
// 格式化文本
let name = "张三"
Text("欢迎 %@", name)
日期和数字格式化
// 日期格式化
let date = Date()
Text(date, style: .date) // 仅日期
Text(date, style: .time) // 仅时间
Text(date, style: .relative) // 相对时间
Text(date, style: .offset) // 时间偏移
Text(date, style: .timer) // 计时器
// 数字格式化
let number = 123456.789
Text(number, format: .number)
Text(number, format: .currency(code: "CNY"))
Text(number, format: .percent)
3.2 图片显示:Image
Image 组件介绍
Image 用于显示图片,可以从系统图标、资源文件或网络加载图片。
基本用法
// 系统图标
Image(systemName: "star.fill")
// 资源文件图片
Image("avatar")
// 网络图片 (iOS 15+)
AsyncImage(url: URL(string: "https://example.com/image.jpg")) { phase in
switch phase {
case .empty:
ProgressView() // 加载中
case .success(let image):
image
.resizable()
.aspectRatio(contentMode: .fill)
case .failure:
Image(systemName: "photo") // 加载失败
@unknown default:
EmptyView()
}
}
图片修饰符
Image("avatar")
.resizable() // 可调整大小
.aspectRatio(contentMode: .fit) // 内容模式
.frame(width: 100, height: 100) // 设置大小
.clipShape(Circle()) // 裁剪形状
.overlay( // 叠加内容
Circle()
.stroke(Color.blue, lineWidth: 2)
)
.shadow(radius: 5) // 阴影
.opacity(0.8) // 透明度
系统图标
// 系统图标
Image(systemName: "heart.fill")
.foregroundStyle(.red)
.font(.system(size: 24))
// 多色图标 (iOS 15+)
Image(systemName: "person.fill.badge.plus")
.symbolRenderingMode(.multicolor)
// 可变颜色图标
Image(systemName: "star")
.foregroundStyle(.yellow)
3.3 按钮交互:Button
Button 组件介绍
Button 用于创建可点击的按钮,支持多种样式和交互方式。
基本用法
// 基本按钮
Button("点击我") {
print("按钮被点击了")
}
// 带图标的按钮
Button {
print("按钮被点击了")
} label: {
HStack {
Image(systemName: "star.fill")
Text("喜欢")
}
}
// 带角色的按钮
Button("删除", role: .destructive) {
print("删除操作")
}
按钮样式
// 边框按钮
Button("边框按钮") {
// 操作
}
.buttonStyle(.bordered)
// 突出显示的按钮
Button("突出按钮") {
// 操作
}
.buttonStyle(.borderedProminent)
.tint(.blue) // 按钮颜色
// 胶囊按钮
Button("胶囊按钮") {
// 操作
}
.buttonStyle(.borderedProminent)
.tint(.green)
.cornerRadius(20)
// 文本按钮
Button("文本按钮") {
// 操作
}
.buttonStyle(.plain)
禁用状态
@State private var isEnabled = false
Button("禁用按钮") {
// 操作
}
.disabled(!isEnabled)
.opacity(isEnabled ? 1.0 : 0.5)
3.4 输入控件:TextField、SecureField、TextEditor
TextField 文本输入框
@State private var text = ""
TextField("请输入文本", text: $text)
.textFieldStyle(.roundedBorder) // 边框样式
.padding() // 内边距
.keyboardType(.default) // 键盘类型
.autocapitalization(.sentences) // 自动大写
.autocorrectionDisabled(true) // 禁用自动纠正
// 带提示的 TextField
TextField(
"请输入用户名",
text: $text,
prompt: Text("用户名不能为空")
.foregroundStyle(.secondary)
)
.textFieldStyle(.roundedBorder)
SecureField 安全输入框
@State private var password = ""
SecureField("请输入密码", text: $password)
.textFieldStyle(.roundedBorder)
.padding()
// 带可见性切换的密码输入
@State private var showPassword = false
ZStack(alignment: .trailing) {
if showPassword {
TextField("请输入密码", text: $password)
} else {
SecureField("请输入密码", text: $password)
}
Button(action: {
showPassword.toggle()
}) {
Image(systemName: showPassword ? "eye.slash.fill" : "eye.fill")
.foregroundStyle(.secondary)
.padding(.trailing, 8)
}
}
.textFieldStyle(.roundedBorder)
.padding()
TextEditor 多行文本编辑器
@State private var message = ""
TextEditor(text: $message)
.frame(height: 150) // 设置高度
.border(Color.gray.opacity(0.3), width: 1) // 边框
.cornerRadius(8) // 圆角
.padding()
.foregroundStyle(.primary) // 文本颜色
// 带占位符的 TextEditor
ZStack(alignment: .topLeading) {
TextEditor(text: $message)
.frame(height: 150)
.padding(8)
if message.isEmpty {
Text("请输入消息...")
.foregroundStyle(.secondary)
.padding(10)
.allowsHitTesting(false) // 允许点击穿透
}
}
.border(Color.gray.opacity(0.3), width: 1)
.cornerRadius(8)
.padding()
3.5 开关与选择:Toggle、Picker、Slider、Stepper
Toggle 开关
@State private var isEnabled = false
Toggle("启用功能", isOn: $isEnabled)
.toggleStyle(.switch) // 开关样式
.padding()
// 带图标的 Toggle
Toggle(isOn: $isEnabled) {
HStack {
Image(systemName: "bell.fill")
Text("接收通知")
}
}
.toggleStyle(.switch)
.padding()
Picker 选择器
@State private var selectedOption = "选项1"
let options = ["选项1", "选项2", "选项3"]
// 分段控件样式
Picker("选择", selection: $selectedOption) {
ForEach(options, id: \.self) {
Text($0)
}
}
.pickerStyle(.segmented)
.padding()
// 菜单样式
Picker("选择", selection: $selectedOption) {
ForEach(options, id: \.self) {
Text($0)
}
}
.pickerStyle(.menu)
.padding()
// 轮盘样式(iOS 14+)
@State private var selectedColor = Color.red
let colors: [Color] = [.red, .green, .blue, .yellow]
Picker("颜色", selection: $selectedColor) {
ForEach(colors, id: \.self) {
ColorPickerView(color: $0)
}
}
.pickerStyle(.wheel)
.frame(height: 200)
.padding()
// 辅助视图
struct ColorPickerView: View {
let color: Color
var body: some View {
HStack {
Rectangle()
.fill(color)
.frame(width: 20, height: 20)
.cornerRadius(4)
Text(String(describing: color))
}
}
}
Slider 滑块
@State private var value = 0.5
Slider(value: $value, in: 0...1)
.padding()
.tint(.blue) // 滑块颜色
// 带标签的滑块
Slider(
value: $value,
in: 0...1,
label: { Text("亮度") },
minimumValueLabel: { Text("暗") },
maximumValueLabel: { Text("亮") }
)
.padding()
// 整数滑块
@State private var intValue = 5
Slider(value: Binding(
get: { Double(intValue) },
set: { intValue = Int($0) }
), in: 0...10, step: 1)
.padding()
Text("值:\(intValue)")
Stepper 步进器
@State private var count = 0
Stepper("数量:\(count)", value: $count)
.padding()
// 带范围的步进器
Stepper(
"数量:\(count)",
value: $count,
in: 0...10,
step: 2
)
.padding()
// 带标签的步进器
Stepper {
Text("数量:\(count)")
} onIncrement: {
count += 1
print("增加到:\(count)")
} onDecrement: {
count -= 1
print("减少到:\(count)")
}
.padding()
3.6 进度指示:ProgressView
不确定进度
// 基本进度指示器
ProgressView()
// 带标签的进度指示器
ProgressView("加载中...")
// 带样式的进度指示器
ProgressView("处理中...")
.progressViewStyle(.circular)
.tint(.blue)
.padding()
确定进度
@State private var progress = 0.0
ProgressView("下载进度", value: progress, total: 1.0)
.padding()
// 带百分比的进度条
ProgressView(
value: progress,
total: 1.0,
label: { Text("下载进度") },
currentValueLabel: { Text("\(Int(progress * 100))%") }
)
.padding()
// 水平进度条样式
ProgressView(value: progress, total: 1.0)
.progressViewStyle(.linear)
.tint(.green)
.frame(height: 10)
.padding()
实战:创建一个用户设置页面
需求分析
创建一个包含以下元素的用户设置页面:
- 个人信息区域
- 通知设置(开关)
- 主题选择(选择器)
- 字体大小(滑块)
- 清除缓存按钮
- 退出登录按钮
代码实现
import SwiftUI
struct SettingsView: View {
// 状态变量
@State private var notificationsEnabled = true
@State private var selectedTheme = "浅色"
@State private var fontSize = 16.0
@State private var cacheSize = "128 MB"
// 主题选项
let themes = ["浅色", "深色", "跟随系统"]
var body: some View {
NavigationStack {
List {
// 个人信息区域
Section {
HStack {
Image(systemName: "person.circle.fill")
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: 60, height: 60)
.foregroundStyle(.blue)
VStack(alignment: .leading, spacing: 4) {
Text("张三")
.font(.headline)
Text("zhangsan@example.com")
.font(.subheadline)
.foregroundStyle(.secondary)
}
Spacer()
Image(systemName: "chevron.right")
.foregroundStyle(.secondary)
}
.padding(.vertical, 8)
}
// 通知设置
Section("通知设置") {
Toggle("接收推送通知", isOn: $notificationsEnabled)
Toggle("声音提醒", isOn: $notificationsEnabled)
Toggle("振动提醒", isOn: $notificationsEnabled)
}
// 外观设置
Section("外观设置") {
Picker("主题", selection: $selectedTheme) {
ForEach(themes, id: \.self) {
Text($0)
}
}
.pickerStyle(.menu)
VStack(alignment: .leading, spacing: 8) {
Text("字体大小:\(Int(fontSize))")
Slider(value: $fontSize, in: 12...24, step: 1)
.tint(.blue)
}
}
// 存储设置
Section("存储设置") {
HStack {
Text("缓存大小")
Spacer()
Text(cacheSize)
.foregroundStyle(.secondary)
}
Button("清除缓存") {
// 清除缓存逻辑
print("清除缓存")
}
.foregroundStyle(.blue)
}
// 账户设置
Section {
Button("关于我们") {
// 关于我们逻辑
}
Button("隐私政策") {
// 隐私政策逻辑
}
Button("退出登录", role: .destructive) {
// 退出登录逻辑
}
}
}
.navigationTitle("设置")
.navigationBarTitleDisplayMode(.inline)
}
}
}
#Preview {
SettingsView()
}
代码解析
- List 和 Section:使用列表和分组组织设置项
- NavigationStack:提供导航功能
- Toggle:用于开关设置
- Picker:用于主题选择
- Slider:用于调整字体大小
- Button:用于操作按钮
- HStack 和 VStack:用于布局
- @State:用于管理视图状态
小结
本章介绍了 SwiftUI 中的基础视图组件,包括:
Text:文本显示,支持富文本、本地化和格式化Image:图片显示,支持系统图标、资源文件和网络图片Button:按钮交互,支持多种样式和角色- 输入控件:
TextField、SecureField、TextEditor - 选择控件:
Toggle、Picker、Slider、Stepper - 进度指示:
ProgressView - 一个完整的用户设置页面实战
通过本章的学习,你已经掌握了 SwiftUI 中最常用的基础组件,能够创建各种常见的用户界面元素。
参考资料
- SwiftUI 官方文档
- Apple Developer Documentation: Text
- Apple Developer Documentation: Image
- Apple Developer Documentation: Button
- SwiftUI by Example
本内容为《SwiftUI 基础教程》第三章,欢迎关注后续更新。