发布于 2025-08-03, 更新于 2025-08-09
整理一些 SwiftUI 入门常用组件和对应修饰符的笔记,以及一些参考文档地址等。
Shift + Cmd + LShow The View Library 查看所有 SwiftUI 组件及其简易用法,可以直接拖拽到代码中生成组件调用的代码。Show The Modifiers Library 查看所有 SwiftUI 修饰符Control + 点击 组件查看文档Text("内容"):文本视图,用于显示静态文本,可以格式化数字、货币等Text(String(num)) 或 Text("\(num)")。format 属性进行转换,如 Text(num, format: .number)Image("图名"):显示图像资源globe(来自 SF Symbols 系统图标库),无需额外引入资源。Image(systemName: "timelapse", variableValue: 0.2) 部分图标支持变量值,如 timelapse 支持传入进度值.imageScale(.large) 用于调整图片的尺寸比例,特别是使用 SF Symbols )时,可以方便地设置小、中、大三种尺寸。.resizable() 允许图片调整大小,使用自定义图片时, imageScale 需要和 resizable 一起用VStack:垂直堆栈布局容器,用于垂直排列子视图alignment 参数:设置子视图的对齐方式。spacing 参数:设置子视图之间的间距。HStack:水平堆栈布局容器,用于水平排列子视图。ZStack:视图层级叠加的核心布局容器,让子视图沿 Z 轴(垂直于屏幕方向)堆叠,形成多层视图结构。Spacer():间隔视图,用于在布局中填充空白空间List { ... }:可滚动列表容器,自动滚动,自动复用(高性能),支持滑动删除、移动、编辑模式,配合 Section 展示分组内容.onDelete(perform: deleteIntakes) 添加删除功能.swipeActions { ... } 添加滑动操作按钮ScrollView { ... } 可滚动容器,内部不能嵌套 ListForm { ... }:表单容器,自动布局输入控件,支持分组或组件嵌套Section("标题") { ... }:用于 Form 或 List 分区,支持添加标题和页脚,内部嵌套组件ForEach:遍历数据ForEach(0..<100) { number in ... }。ForEach(students, id: \.self) 遍历数组时,id 参数唯一标识,\.self 表示内容本身,适用于内容本身唯一的场景。SwiftData 模型时,框架自动提供唯一标识符,无需显式声明TextField("提示", text: $value):单行输入框value,并传入 format 参数进行转换。TextField("输入数字", value: $num, format: .number)。.currency(code: Locale.current.currency?.identifier ?? "USD")。.textFieldStyle(RoundedBorderTextFieldStyle()) 设置输入框样式。.keyboardType() 修饰符,指定键盘类型,如 .numberPad(数字键盘)或 .decimalPad(支持小数点的数字键盘)。.focused($amountIsFocused) 绑定焦点状态,变量需要是 @FocusState 的布尔值Picker("选项", selection: $choice) { ... }:下拉选择器Text,并通过 ForEach 遍历选项。.tag() 修饰符,指定选项值,如 ForEach 中使用 $0。.pickerStyle() 修饰符修改选择器样式:.navigationLink 弹出全屏选择窗口,需在 NavigationStack 中使用。.segmented 分段选择器Toggle("启用提醒", isOn: $isReminderEnabled):开关控件,用于切换布尔值DatePicker("时间选择器标签", selection: $binding, displayedComponents: .hourAndMinute):日期/时间选择器displayedComponents 参数指定显示的时间组件。Button("按钮") { ... }:按钮,触发操作.buttonStyle(.borderedProminent) 设置按钮样式。Button {
print("Clicked!")
} label: {
Text("Got it!")
.padding(.all)
.frame(maxWidth: .infinity)
.background(RoundedRectangle(cornerRadius: 10).stroke())
}
Menu("添加饮水记录") { ... }:菜单控件,用于显示选项菜单ButtonNavigationStack { ... }:导航容器(iOS 16+),避免内容滚动到灵动岛影响阅读.navigationTitle("SwiftUI") 设置导航标题。.navigationBarTitleDisplayMode(.inline) 设置标题显示模式(影响字体大小、位置)。.toolbar { ... } 控制右上角按钮,可增加判断条件按需显示。.toolbar 中配置 ToolbarItem(placement: .navigationBarTrailing) { ... },工具栏项组件可包含多个按钮。placement 参数指定工具项的位置。NavigationView { ... }:导航视图,用于创建带导航栏的界面。NavigationLink("链接文本") { ... }:导航链接,用于在导航视图中创建可点击的导航项。TabView { ... }:标签页容器,用于创建标签页界面。NavigationView { ... } 组件。.tabItem { ... } 定义每个标签页底部标签项的标题和图标ProgressView(value: currentIntake, total: dailyGoal):进度条视图,用于显示进度。.progressViewStyle(LinearProgressViewStyle()) 设置进度条样式。.frame() 尺寸约束.frame(width: 200, height: 100, alignment: .center) 设置视图高度、宽度、对齐方式,各项可单独设置.frame(maxWidth: .infinity) 允许扩展到指定最大值,.infinity 表示视图最大可以扩展到无限宽,会被解释为"请给我所有可用空间",可撑满父容器宽度。.padding() 添加内边距.padding(.all) 设置所有方向的内边距.padding(.horizontal) 添加水平的内边距.position().offset().foregroundColor(.red) 设置前景色(文本/图标颜色).foregroundColor(.accentColor) 设置为强调色.border() 设置边框颜色.border(Color.accentColor, width: 1) 设置边框颜色为强调色,宽度为 1.tint(.blue) 设置视图的强调色(Accent Color) 或主题色.background(Color.yellow) 设置背景视图或颜色.background(RoundedRectangle(cornerRadius: 10).stroke()) 支持填充其他内容作为背景,如填充一个只有边框的圆角矩形,实现圆角矩形边框按钮.background(.ultraThinMaterial) 将背景设置为透明的材质效果(可选择不同透明度, ultraThinMaterial 透明度最高).cornerRadius(20) 矩形类组件设置圆角.shadow(color: .gray, radius: 5, x: 2, y: 2) 设置阴影.accentColor(.black) 修改组件的强调色,默认是项目的强调色.font(.headline) 设置字体样式,对应的预设值包含字重、大小、字体的效果.font(.system(size: 20, weight: .bold)) 单独设置字号、字重.fontWeight(.bold) 单独设置字重,设置完 font 还需要微调时使用.multilineTextAlignment(.center) 设置多行文本对齐方式.lineLimit(2) 限制文本显示行数.opacity(0.5) 设置透明度.disabled() 控件是否禁用,用于 Button 、 Picker 等可交互组件.disabled(!isReminderEnabled) 根据条件禁用视图.onTapGesture { ... } 点击事件,在大括号内编写点击等行为,可用于所有组件.animation(.easeInOut, value: isAnimating) 绑定值改变时,对应的属性变化触发动画.background(isAnimating ? .blue : .red).animation(.easeInOut(duration: 1), value: isAnimating) 指定动画时长.transition(.slide) 视图插入/移除的动画效果可通过 .overlay 在视图上方叠加其他内容
Rectangle()
.fill(Color.green)
.frame(width: 200, height: 150)
.overlay(
Text("右上角"),
alignment: .topTrailing // 文本定位在右上角
)
在背景上再覆盖一个圆角矩形,还用 backgroud 叠上去效果比较奇怪,可使用 overlay 配合。
.background(.ultraThinMaterial)
.cornerRadius(50)
.overlay(RoundedRectangle(cornerRadius: 50).stroke())