【问题标题】:How to align ScrollView content to top when both axes are used?使用两个轴时如何将 ScrollView 内容对齐到顶部?
【发布时间】:2021-10-07 21:28:31
【问题描述】:

这是一个简单的例子:

struct Example: View {
    var body: some View {
        ScrollView([.horizontal, .vertical], showsIndicators: false, content: {
            LazyVStack(content: {
                ForEach(1...10, id: \.self) { count in
                    Text("Item \(count)")
                }
            })
        })
    }
}

问题在于,当同时使用两个轴 ([.horizontal, .vertical]) 时,ScrollView 会自动居中 垂直和水平方向的任何内容。我在ScrollView 中有一个大数据表,我需要将它与 top 对齐,但我不知道该怎么做。带有Vstacks 和Spacers 的通常的东西在这里根本不起作用。

【问题讨论】:

  • 这是否回答了您的问题stackoverflow.com/a/59739911/12299030
  • @Asperi 它对 X 轴有帮助,但对 Y(我需要)没有。当垂直滚动时,项目开始突然消失(因为LazyVStack,但它发生在滚动视图中,就像它忽略了即将消失的项目在滚动视图中仍然可见的事实)。我希望我的解释是有道理的......

标签: ios swift swiftui scrollview lazyvstack


【解决方案1】:

我做了一个例子,带有Slider,所以你可以交互式地测试它。

确保ScrollView 中的内容至少ScrollView 本身一样高。这会导致内容填充整个垂直空间,因此它将从顶部开始。

代码:

struct Example: View {
    @State private var count: Double = 10

    var body: some View {
        VStack {
            GeometryReader { geo in
                ScrollView([.horizontal, .vertical], showsIndicators: false, content: {
                    VStack(spacing: 0) {
                        LazyVStack {
                            ForEach(1 ... Int(count), id: \.self) { count in
                                Text("Item \(count)")
                            }
                        }

                        Spacer(minLength: 0)
                    }
                    .frame(width: geo.size.width)
                    .frame(minHeight: geo.size.height)
                })
            }

            Slider(value: $count, in: 10 ... 100)
        }
    }
}

在某些情况下,您可能需要使用.frame(minWidth: geo.size.width) 而不仅仅是width。这可以与minHeight 在同一行。

【讨论】:

  • 感谢您的回答!非常适合 VStacks,但它也必须适用于 LazyVStack,因为可能有大量项目。
  • @Randex 抱歉,暂时改了。我会尝试使用LazyVStack
  • 效果很好,非常感谢!你的第一个解决方案让我觉得我需要手动计算垫片的minLength,但你的最终解决方案比我的要干净得多:)
  • @Randex 在试图弄清楚时,我被 2 个GeometryReaders 搞得一团糟......然后我意识到我可以让它变得更简单
  • 好的,所以我在我的项目中对其进行了更多测试,在该滚动视图中有一个非常宽的表格,我注意到当内容比屏幕宽度宽时,它不会由于.frame(width: geo.size.width),不允许您水平滚动。要解决此问题,您需要改用minWidth。我们也可以将所有这些都放在一个.frame 调用中:.frame(minWidth: geo.size.width, minHeight: geo.size.height)
猜你喜欢
  • 1970-01-01
  • 2017-03-17
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 2020-12-17
  • 1970-01-01
  • 2019-05-20
相关资源
最近更新 更多