GeometryReader - это контейнерное представление, которое определяет его содержимое в зависимости от его собственного размера и координатного пространства. Возвращает гибкий предпочтительный размер в родительский макет.
in
struct ContentView: View {
var body: some View {
ScrollView {
VStack {
Text("Section 1")
GridView(columns: 2, items: [1, 3, 5, 7, 9, 11, 13, 15]) { num in
Text("Item \(num)")
}
.background(Color.red.opacity(0.5))
}.background(Color.green.opacity(0.2))
}.background(Color.blue.opacity(0.2))
}
}
Какая высота у GridView? Hm ... количество строк, умноженное на высоту ячейка сетки, которая является высотой GridView, деленной на количество строк ...
Уравнение не имеет решения: -)
Да, я вижу, вы определили высоту ячейки сетки как ширину GridView делится на количество столбцов, но SwiftUI не такой умный.
Вы должны рассчитать высоту GridView. Я установил число строк в 4, чтобы упростить его ...
struct ContentView: View {
var body: some View {
GeometryReader { g in
ScrollView {
VStack {
Text("Section 1")
GridView(columns: 2, items: [1, 3, 5, 7, 9, 11, 13, 15]) { num in
Text("Item \(num)")
}.frame(height: g.size.width / 2 * CGFloat(4))
.background(Color.red.opacity(0.5))
}.background(Color.green.opacity(0.2))
}.background(Color.blue.opacity(0.2))
}
}
}
Вы лучше удалите считыватель геометрии и рамку ячейки сетки из GridView.body и установите размер ячейки в вашем представление содержимого.
struct ContentView: View {
var body: some View {
GeometryReader { g in
ScrollView {
VStack {
Text("Section 1")
GridView(columns: 2, items: [1, 3, 5, 7, 9, 11, 13, 15]) { num in
Text("Item \(num)").frame(width: g.size.width / 2, height: g.size .width / 2)
}
.background(Color.red.opacity(0.5))
}.background(Color.green.opacity(0.2))
}.background(Color.blue.opacity(0.2))
}
}
}
Как видите, нет необходимости определять высоту GridView, уравнение теперь имеет решение.