16

我很想构建一个滚动屏幕,所以我想嵌入它ScrollView。但我无法实现它,视图只是缩小到它的压缩大小。假设我想要ScrollView垂直滚动,所以我希望内容与 scrollView 的宽度相匹配。所以我使用这样的预览:

struct ScrollSubview_Previews : PreviewProvider {
    static var previews: some View {
        func textfield() -> some View {
            TextField(.constant("Text")).background(Color.red)
        }

        return Group {
            textfield()
            ScrollView {
                textfield()
            }
        }
    }
}

但它以这样的结果结束:

在此处输入图像描述

4

6 回答 6

14

一种简单的方法,使用frame(maxWidth: .infinity)

    ScrollView(.vertical) {
        VStack {
           ForEach(0..<100) {
              Text("Item \($0)")
          }
       }
       .frame(maxWidth: .infinity)
   }
于 2020-07-05T03:04:04.427 回答
11

实际上你不再需要几何阅读器了。ScrollView 已在 XCode beta 3 中进行了重构 现在您可以声明您有一个 .horizo​​ntal ScrollView 或 .vertical 这使得 ScrollView 的行为就像任何普通的 View 协议一样。

前任:

ScrollView(.horizontal, showsIndicators: false) {
    HStack {
        ForEach((1...10).reversed()) {
            AnyViewYouWant(number: $0)
        }
    }
}

这将导致其父级宽度水平滚动的视图。高度将由 ScrollView 的子视图高度定义。

于 2019-07-04T20:20:27.557 回答
10

这是一个技巧:引入HStack只有一个的 a Spacer

return Group {
        HStack {
            Spacer()
        }
        textfield()
        ScrollView {
            textfield()
        }
    }
于 2019-06-07T02:12:40.170 回答
7

这是 beta 2 中也存在的一个已知问题 - 在此处查看 Apple 的 Xcode 11 发行说明⬇️ https://developer.apple.com/documentation/xcode_release_notes/xcode_11_beta_2_release_notes

Apple自己提到的解决方法是在元素内为ScrollView设置固定框架。在这种情况下,我建议使用 GeometryReader 来修复屏幕宽度,高度会自动适应内容。

例如,如果您需要使 ScrollView 的内容适合屏幕宽度,您可以执行以下操作:

return GeometryReader { geometry in
     Group {
         self.textfield()
         ScrollView {
             self.textfield()
                 .frame(width: geometry.size.width)
         }
     }
 }
于 2019-06-25T13:23:49.713 回答
0
  • 您也可以使用额外的 HStack 和空间来完成此操作。

    ScrollView(.vertical) {
        HStack {
            VStack {
                 ForEach(0..<100) {
                    Text("Item \($0)")
                 }
             }
             Spacer()
         }
    }
    
于 2021-05-06T12:18:24.070 回答
-4

PreviewProvider 只是关于您的 Canvas(渲染视图)。

如果你想将文本放入 ScrollView 你应该创建你的 View

struct MyViewWithScroll : View {
    var body: some View {
        ScrollView {
            Text("Placeholder")
        }
    }
}

之后,在 Canvas 中渲染您的 MyViewWithScroll(代码编辑器右侧的 iPhone 窗口)

#if DEBUG
struct MyViewWithScroll_Previews : PreviewProvider {
    static var previews: some View {
        MyViewWithScroll()
    }
}
#endif
于 2019-06-06T19:38:26.960 回答