SwiftUI:ScrollView如何让我们处理滚动数据

译自How ScrollView lets us work with scrolling data

您已经了解了List和Form如何让我们创建数据的滚动表,但是对于我们想要滚动任意日期的时间(即,只是我们手工创建的某些视图),我们需要转向SwiftUI的ScrollView`。

滚动视图可以水平,垂直或双向滚动,您还可以控制系统是否应在滚动视图旁边显示滚动指示器——这些滚动条看起来很小,可以让用户感知内容的大小。当我们将视图放置在滚动视图中时,它们会自动确定内容的大小,以便用户可以从一个边缘滚动到另一边缘。

例如,我们可以创建一个包含100个文本视图的滚动列表,如下所示:

ScrollView(.vertical) {
    VStack(spacing: 10) {
        ForEach(0..<100) {
            Text("Item \($0)")
                .font(.title)
        }
    }
}

如果您在模拟器中重新运行该滚动条,则会看到可以自由拖动滚动视图,并且如果滚动到底部,您还将看到ScrollViewListForm一样对待安全区域——它们的内容位于主页指示器,但是它们添加了一些额外的填充,因此最终视图是完全可见的。

您可能还会注意到,直接在中心点击会很烦人——整个区域都可以滚动才是更常见的。要获得这种行为,我们应该使VStack占用更多空间,同时保持默认的中心对齐不变,如下所示:

ScrollView(.vertical) {
    VStack(spacing: 10) {
        ForEach(0..<100) {
            Text("Item \($0)")
                .font(.title)
        }
    }
    .frame(maxWidth: .infinity)
}

现在,您可以在屏幕上的任意位置点击并拖动,这更加方便了用户。

这一切似乎都非常简单,确实,与我们必须与UIKit一起使用的旧版UIScrollView相比,ScrollView明显要容易得多。不过,您需要注意一个重要的注意事项:将视图添加到滚动视图时,它们会立即创建。

为了说明这一点,我们可以围绕常规文本视图创建一个简单的包装,如下所示:

struct CustomText: View {
    var text: String

    var body: some View {
        Text(text)
    }

    init(_ text: String) {
        print("Creating a new CustomText")
        self.text = text
    }
}

现在我们可以在ForEach中使用它:

ForEach(0..<100) {
    CustomText("Item \($0)")
        .font(.title)
}

结果看起来相同,但是现在当您运行该应用程序时,您会在Xcode的日志中看到打印了一百次的"Creating a new CustomText"——SwiftUI不会等到您向下滚动能看到它们时再创建,它会立即创建它们。

您可以使用List尝试相同的实验,如下所示:

List {
    ForEach(0..<100) {
        CustomText("Item \($0)")
            .font(.title)
    }
}
该代码运行时,您会发现它的行为是惰性的:仅在真正需要时才创建CustomText实例。
SwiftUI:使用GeometryReader调整图片大小以适应屏幕 Hacking with iOS: SwiftUI Edition SwiftUI:使用NavigationLink将新视图压入堆栈

赏我一个赞吧~~~

你可能感兴趣的:(SwiftUI:ScrollView如何让我们处理滚动数据)