我在 SwiftUI 中有一个滚动视图,我不想在滚动时剪切超出范围的内容。在 UIKit 中,我们可以通过将滚动视图的
clipsToBounds
设置为 false
来实现这一点。你会如何在 SwiftUI 中做同样的事情。或者在 SwiftUI 中实现类似行为的最佳实践是什么?
顺便说一句,我知道我们可以使用
UIViewRepresentable
来映射 UIKit 视图,或者如果我们使用像 SwiftUI-Introspect 这样的库,我们可以获取底层 UIKit 滚动视图并将 clipsToBounds
设置为 false。但我想知道是否有原生 SwiftUI 方法可以做到这一点。
这是一些代码,可以使问题更加清晰。
struct MyScrollView: View {
var body: some View {
VStack(spacing: 0) {
header
content
}
}
var header: some View {
Text("Header")
.padding()
.frame(minHeight: 200)
}
var content: some View {
ScrollView {
Text("Content").padding()
Text("Content").padding()
Text("Content").padding()
Text("Content").padding()
Text("Content").padding()
}
.frame(maxWidth: .infinity)
.background(.orange)
}
}
这就是它呈现的内容,当我向上滚动时,滚动视图内容被剪切。
我正在寻找的是这样的,当我向上滚动时,我应该能够看到标题下的内容。
提前致谢:)
编辑:使用堆栈并向滚动视图添加一个空标题:
struct MyScrollView: View {
var body: some View {
ZStack {
content
VStack {
header
Spacer()
}
}
}
var header: some View {
Text("Header")
.padding()
.frame(minHeight: 200)
}
var content: some View {
ScrollView {
Spacer()
.frame(height:200)
Text("Content").padding()
Text("Content").padding()
Text("Content").padding()
Text("Content").padding()
Text("Content").padding()
Text("Content").padding()
Text("Content").padding()
Text("Content").padding()
Text("Content").padding()
}
.frame(maxWidth: .infinity)
.background(.orange)
}
}
在 iOS 17 上,SwiftUI 有一个名为
.scrollClipDisabled()
的视图修饰符
在此版本之前,你可以这样做
public extension UIScrollView {
override var clipsToBounds: Bool {
get { false }
set {}
}
}