Swiftui等效于夹具?

发布于 2025-01-24 08:33:42 字数 1504 浏览 0 评论 0 原文

我在Swiftui中有一个ScrollView,我不想在滚动时夹住不在范围的内容。在Uikit中,我们可以通过将 设置为 false 来实现这一目标。您将如何在Swiftui中做同样的事情。还是在Swiftui中实现类似行为的最佳实践是什么?

顺便说一句,我知道我们可以使用 uiviewRepresentable 来映射Uikit视图,或者如果我们使用某些库,例如 SwiftUi-Introspect 我们可以获取基础的Uikit scrollview,并设置 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)
    }
} 

这就是它呈现的,当我向上滚动时,ScrollView内容被剪辑。

我要寻找的是这样,当我向上滚动时,我应该能够在标题下看到内容。

预先感谢:)

I have a scrollview in SwiftUI for which I dont want to clip the contents which are out of bounds while scrolling. In UIKit, we can achieve this by setting clipsToBounds to false for the scrollview. How would you do the same in SwiftUI. Or what's the best practice to achieve a similar behavior in SwiftUI?

Btw I know we can use UIViewRepresentable to map UIKit view or if we use some libraries like SwiftUI-Introspect we can get the underlying UIKit scrollview and set clipsToBounds to false. But I'd like to know if there is a native SwiftUI way to do it.

This is some code which could make the question a bit more clear.

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)
    }
} 

This is what it renders, scrollview content is clipped as I scroll up.

enter image description here

What I'm looking for is like this, I should be able to see content under the header as I scroll up.

enter image description here

Thanks in advance :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

当爱已成负担 2025-01-31 08:33:42

编辑:使用堆栈并在滚动视图中添加空标头:

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)
    }
}

EDIT : Use a Stack and add an empty header to the scroll view:

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)
    }
}
不语却知心 2025-01-31 08:33:42

在iOS 17上,SwiftUi具有一个视图修饰符,称为 .scrollClipDisabled()

在此版本之前,您可以执行

public extension UIScrollView {
    override var clipsToBounds: Bool { 
        get { false } 
        set {}
    }
}

On iOS 17, SwiftUI has a view modifier called .scrollClipDisabled()

Before this version, you can do

public extension UIScrollView {
    override var clipsToBounds: Bool { 
        get { false } 
        set {}
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文