Scrollview 不会滚动过去的带有偏移量的视图

Posted

技术标签:

【中文标题】Scrollview 不会滚动过去的带有偏移量的视图【英文标题】:Scrollview doesn't scroll past views with an offset 【发布时间】:2021-01-07 00:35:55 【问题描述】:

为了解决一个更复杂的问题,我创建了以下简单的测试项目:

struct ContentView: View 
    var body: some View 
        ScrollView 
            ZStack 
                ForEach(0..<50)  index in
                    Text("Test \(index)")
                        .offset(x: 0, y: CGFloat(index * 20))
                
            
        
    


struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView()
    

这会在 ZStack 中绘制 50 个文本视图,每个视图都有较大的 y 偏移量,因此它们被绘制到屏幕的可见部分之外:

整个东西都包裹在一个 ScrollView 中,所以我希望我应该能够向下滚动到最后一个视图。

但是,它不会滚动到测试 26。

如何通过分配偏移量和更新 ScrollView 的 contentSize 来安排 ZStack 内的视图?

【问题讨论】:

使用 Vstack 而不是 ZStack 在这个特定的示例中,我意识到我只是将视图垂直放置,但这并不重要 - 我试图找出的是如何根据视图更改 contentSize有一个偏移量。 是否应该根据offset值的总和来计算内容大小? offset 不会改变视图布局,视图保持在创建它的位置,但在偏移位置渲染;其他视图的框架也不受影响。请注意。 【参考方案1】:

内容大小由ScrollView内部的视图大小计算得出。所以我们唯一能做的就是改变视图大小。

默认情况下,VStack 大小是其中视图的总大小(实际视图大小)。

在这种情况下,我们也可以使用frame() 来更改大小。检查apple document

由于 VStack 在中间排列视图,我们可以将其对齐到 .top

struct ContentView: View 
    var body: some View 
        ScrollView() 
            VStack 
                ForEach(0..<50)  index in
                    Text("Test \(index)")
                        .offset(x: 0, y: CGFloat(index * 20))
                
            
            .frame( height: 2000, alignment: .top) //<=here
            .border(Color.black)
        
    

【讨论】:

【参考方案2】:

如果我正确理解了你的意图,那么在这种情况下你根本不需要偏移(SwiftUI 的工作方式不同)

    ScrollView 
        VStack 
            ForEach(0..<50)  index in
                Text("Test \(index)")   // << use .padding if needed
            
        
    

注意:偏移量不会改变视图布局,视图保持在创建它的地方,但在偏移量位置渲染;其他视图的框架也不受影响。请注意。

【讨论】:

谢谢。我最终使用填充在 ZStack 中创建偏移量,这个正确更新了边界。

以上是关于Scrollview 不会滚动过去的带有偏移量的视图的主要内容,如果未能解决你的问题,请参考以下文章

滚动到带有偏移量的 div ID

获取 SwiftUI ScrollView 的当前滚动位置

添加为子视图后,ScrollView 不会滚动

为啥 contentView 在滚动视图中有 y 偏移

在 C++ 中使用带有多级指针和偏移量的 WriteProcessMemory()?

带有索引/偏移量的Ruby gsub?