为啥 VStack 不能在带有滚动视图的 GeometryReader 中工作?

Posted

技术标签:

【中文标题】为啥 VStack 不能在带有滚动视图的 GeometryReader 中工作?【英文标题】:why is VStack not working in GeometryReader with scrollview?为什么 VStack 不能在带有滚动视图的 GeometryReader 中工作? 【发布时间】:2020-04-01 07:05:37 【问题描述】:

我使用 vStack 的滚动视图在没有 GeometryReader 的情况下工作(在 AppleTV 中 - 我没有在 ios 中测试)。

然后我添加了几何读取器,并且 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
            
        )
    

【讨论】:

这正是我想要的,谢谢你,你是我的英雄! ;)

以上是关于为啥 VStack 不能在带有滚动视图的 GeometryReader 中工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中动态调整可垂直滚动的 VStack 中的一行中的项目数?

带有灵活 Spacer 的 SwiftUI VStack

为啥 SwiftUI 不能正确显示两个视图?

为啥我的页面控制器不能无限向后滚动?

为啥 View Controller 在 UIScrollView 上方滚动?

SwiftUI VStack 间距:无法正常工作