使用 GeometryReader 构建自适应布局
读取父视图几何信息,构建按比例且适配设备的用户界面。
使用 GeometryReader 构建自适应布局 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
欢迎
`GeometryReader` 会读取父视图提供的可用尺寸,让您能够根据屏幕或容器尺寸按比例构建布局。
基本用法
```swift
GeometryReader { geo in
Text("Width: \(Int(geo.size.width))")
.frame(width: geo.size.width * 0.8)
}
```
GeometryProxy 的属性
`GeometryProxy` 提供:
• `size: CGSize` — 可用的宽度和高度
• `safeAreaInsets: EdgeInsets` — 系统安全区域
• `frame(in:)` — 指定坐标空间中的框架
按比例设置尺寸
```swift
GeometryReader { geo in
HStack(spacing: 0) {
Color.blue.frame(width: geo.size.width * 0.6)
Color.green
}
}
```
坐标空间
```swift
GeometryReader { outer in
VStack {
GeometryReader { inner in
let f = inner.frame(in: .named("outer"))
Text("y: \(Int(f.minY))")
}
}
}
.coordinateSpace(name: "outer")
```
安全区域
```swift
GeometryReader { geo in
VStack {
Spacer()
Text("Bottom safe: \(Int(geo.safeAreaInsets.bottom))")
.padding(.bottom, geo.safeAreaInsets.bottom)
}
}
```
视差滚动效果
```swift
ScrollView {
ForEach(items) { item in
GeometryReader { geo in
let offset = geo.frame(in: .global).minY
Image(item.image).offset(y: offset * 0.3)
}
}
}
```
用于布局通信的首选项键
```swift
struct HeightKey: PreferenceKey {
static var defaultValue: CGFloat = 0
static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) {
value = max(value, nextValue())
}
}
```
用于将子视图尺寸向上传递到视图层级结构中。
何时避免使用 GeometryReader
`GeometryReader` 默认会填充所有可用空间——使用不当可能会破坏布局。在可能的情况下,请优先使用 `.frame(maxWidth:.infinity)` 和弹性堆栈。
替代方案:布局协议
Swift 5.7+ 引入了 `Layout` 协议,可以在不承担 GeometryReader 开销的情况下实现完全自定义的布局算法。
快速检查
`GeometryProxy.size` 包含什么内容?
回顾
关键要点:
• `GeometryReader { geo in }` 读取父视图提供的尺寸
• `geo.size` — 宽度和高度;`geo.safeAreaInsets` — 系统内边距
• `frame(in:)` — 在命名或全局坐标空间中的位置
• 使用 PreferenceKeys 向上传递尺寸
• 在可能的情况下,优先使用弹性布局而不是 GeometryReader
课程完成!下一步:SwiftUI 数据流。
常见问题解答
「使用 GeometryReader 构建自适应布局」课时是免费的吗?
是的 — 「使用 GeometryReader 构建自适应布局」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「使用 GeometryReader 构建自适应布局」这节课中我会学到什么?
读取父视图几何信息,构建按比例且适配设备的用户界面。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「使用 GeometryReader 构建自适应布局」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- VStack、HStack 与 ZStack 基础
- LazyVGrid 与 LazyHGrid
- Spacer、内边距与 Frame 修饰器
- 使用 GeometryReader 构建自适应布局