在 SwiftUI 中,“Indicator” 是一个常见的概念,用于表示加载状态、进度、导航位置或调节操作的视觉反馈等。不同类型的 Indicator
用于提升用户体验,以下是 SwiftUI 中常见的 Indicator 概念及核心用法。
1. ActivityIndicator (加载指示器,常用于等待状态) #
概念:
- ActivityIndicator 是用来表示操作正在进行(如网络请求或任务执行)的视图。
- 在 SwiftUI 中,对应的控件为
ProgressView
,能够以环形转圈的样式提供加载反馈。
示例代码 #
import SwiftUI
struct ActivityIndicatorView: View {
var body: some View {
ProgressView() // 默认为 Indeterminate 模式
.progressViewStyle(CircularProgressViewStyle())
.scaleEffect(1.5) // 调整大小
.tint(.blue) // 设置主颜色
}
}
常用修饰符 #
ProgressViewStyle
:CircularProgressViewStyle
:环形样式(默认)。LinearProgressViewStyle
:直线样式。
tint(_:)
:设置指示器颜色(iOS 15+) 支持。
2. Progress Indicator (进度条) #
概念:
- 显示任务的执行进度,表示从 0.0 到 1.0 的进度。
- SwiftUI 中的
ProgressView(value:total:)
可以显示具体的进度百分比。
示例代码 #
import SwiftUI
struct ProgressIndicatorView: View {
@State private var downloadProgress = 0.5 // 示例进度值
var body: some View {
VStack {
ProgressView(value: downloadProgress, total: 1.0) { // 显示进度
Text("Downloading…") // 可选:自定义标签
} currentValueLabel: {
Text("\(Int(downloadProgress * 100))%") // 自定义当前位置文本
}
.progressViewStyle(LinearProgressViewStyle()) // 设置直线进度条样式
.padding()
Button("Simulate Download Progress") {
downloadProgress += 0.1 // 模拟进度变化
}
}
}
}
常用修饰符 #
.progressViewStyle(LinearProgressViewStyle())
:直线式进度条(默认)。.progressViewStyle(CircularProgressViewStyle())
:环形进度,适合作为简洁型视觉反馈。- 可动态绑定
value
和total
来表示任务的完成度。
3. Page Indicator (页面指示器/分页位置) #
概念:
- 用于表示用户当前所在分页的位置,比如类似于图片轮播或分页视图。
- 支持通过第三方库(如
TabView
)的PageTabViewStyle
实现。
示例代码 #
import SwiftUI
struct PageIndicatorView: View {
var body: some View {
TabView {
Text("Page 1")
.font(.largeTitle)
.foregroundColor(.red)
.tag(0)
Text("Page 2")
.font(.largeTitle)
.foregroundColor(.blue)
.tag(1)
Text("Page 3")
.font(.largeTitle)
.foregroundColor(.green)
.tag(2)
}
.tabViewStyle(PageTabViewStyle(indexDisplayMode: .always)) // 添加分页指示器
}
}
配置选项 #
.indexDisplayMode
:.always
:始终显示页面指示器。.automatic
:根据上下文触发自动显示。.never
:永久隐藏页面指示器。
4. Slider Indicator(滑块/刻度指示器) #
概念:
- Slider 是一个滑动条指示器,显示一个值或为用户提供调节操作(如进度、音量控制等)。
- SwiftUI 中直接使用
Slider
控件。
示例代码 #
import SwiftUI
struct SliderIndicatorView: View {
@State private var sliderValue: Double = 50
var body: some View {
VStack {
Slider(value: $sliderValue, in: 0...100, step: 1) // 滑块范围 0 ~ 100
.accentColor(.blue) // 设置滑块颜色
.padding()
Text("Current Value: \(Int(sliderValue))") // 显示当前值
.font(.headline)
}
.padding()
}
}
配置选项 #
- 设置滑块范围(
in: 0...100
)。 - 调整步进值(
step: 1
)。 - 使用
accentColor
修改滑块颜色。
5. Scroll Indicator (滚动条指示器) #
概念:
- 隐式滚动条,用于反映
ScrollView
的可滚动内容和用户当前位置。 - 滚动指示器默认会在适当时自动显示,也支持手动控制可见性。
示例代码 #
import SwiftUI
struct ScrollIndicatorView: View {
var body: some View {
ScrollView {
VStack(spacing: 20) {
ForEach(0..<50) { index in
Text("Item \(index)")
.frame(maxWidth: .infinity)
.padding()
.background(Color.gray.opacity(0.2))
.cornerRadius(10)
}
}
}
.scrollIndicators(.automatic) // 自动显示滚动条指示器
}
}
配置选项 #
- 使用
.scrollIndicators
修饰符可控制滚动条显示:.automatic
(默认):在用户滚动时自动显示。.visible
:总是显示滚动条。.hidden
:隐藏滚动条。
6. Drag Indicator (拖动指示器) #
概念:
- 拖动指示器是一种 SFSymbol 样式的顶部
Capsule
,通常用于可拖动的sheet
,帮助用户识别交互区域。 - 在 iOS 16 中,
presentationDragIndicator
控制系统弹窗顶部指示器的可见性。
示例代码: #
.sheet(isPresented: $showSheet) {
Text("Draggable Content")
.presentationDetents([.medium, .large])
.presentationDragIndicator(.visible) // 显示顶部拖动指示器
}
配置选项 #
.visible
:显示拖动指示器(默认)。.hidden
:隐藏指示器。
7. Stepper Indicator (步进指示器) #
概念:
Stepper
是一个小型 UI 控件,允许用户单步调整数值,通常用于递增或递减选择值。- 它是数字或可调整值的人性化探索方式。
示例代码 #
import SwiftUI
struct StepperIndicatorView: View {
@State private var value = 0
var body: some View {
Stepper("Value: \(value)", value: $value, in: 0...10)
.padding()
}
}
功能配置 #
value: $variableName
绑定当前数值。in: 0...10
定义调整范围。
总结:主要 Indicator 类型 #
Indicator 类型 | 控件名称或实现方式 | 用途 |
---|---|---|
Activity Indicator | ProgressView() (环形) | 表示加载状态。 |
Progress Indicator | ProgressView(value:total:) | 显示任务进度条。 |
Page Indicator | TabView().tabViewStyle(PageTabViewStyle()) | 表示分页位置或轮播的当前页面。 |
Slider Indicator | Slider(value:in:step:) | 提供滑动调整数值的交互控件。 |
Scroll Indicator | ScrollView().scrollIndicators(.visible) | 用于滚动可视区域的当前进度反映。 |
Drag Indicator | presentationDragIndicator(.visible) (在 sheet 中) | 指示 sheet 的拖动区域。 |
Stepper Indicator | Stepper("Title", value:in:) | 用于递增或递减一个值的交互控件。 |
这些 Indicator
可以很好地结合使用,提升用户交互和视觉反馈体验!