почему VStack не работает в GeometryReader с просмотром прокрутки?
Мой scrollview с vStack работал (в AppleTV - я не тестировал в iOS) без GeometryReader.
Затем я добавил считыватель геометрии, и VStack "схлопывается" как ZStack.
Что я могу сделать, чтобы решить эту проблему? (и да, мне нужен считыватель геометрии;))
struct ContentView: View {
@State var offset : CGFloat = 0
var body: some View {
ScrollView(.vertical, showsIndicators: false) {
VStack(alignment: .leading) {
GeometryReader { geometry -> AnyView in
let newOffset = geometry.frame(in: .global).minY
if newOffset != self.offset {
self.offset = newOffset
print("new offset",newOffset)
}
return AnyView (
ForEach (0..<5) { _ in
Text("umpf")
}
)
}
}
}
}
}
Результат:
и этот код работает по желанию:
struct ContentView: View {
@State var offset : CGFloat = 0
var body: some View {
ScrollView(.vertical, showsIndicators: false) {
VStack(alignment: .leading) {
// GeometryReader { geometry -> AnyView in
// let newOffset = geometry.frame(in: .global).minY
// if newOffset != self.offset {
// self.offset = newOffset
// print("new offset",newOffset)
// }
// return AnyView (
ForEach (0..<5) { _ in
Text("umpf")
}
// )
// }
}
}
}
}
1 ответ
Решение
Позвольте мне предположить, что изначально вы этого хотели (и это не нарушает макет ScrollView и прокрутку)
var body: some View {
ScrollView(.vertical, showsIndicators: false) {
VStack(alignment: .leading) {
ForEach (0..<5) { _ in
Text("umpf")
}
}.background(
GeometryReader { geometry -> Color in
let newOffset = geometry.frame(in: .global).minY
if newOffset != self.offset {
self.offset = newOffset
print("new offset",newOffset)
}
return Color.clear
}
)
}
}