2

我正在尝试创建一个像这样拖动其容器的 SwiftUI Scrollview:https ://drive.google.com/file/d/1O92DgsVI1OjM1HEUXUwVywB8gcdShOP-/view?usp=sharing

许多 Apple 应用程序都使用它(Apple Maps、Music、Wallet 等),但我还没有找到使用 SwiftUI 的简单方法。您认为简单地实现这一点的最佳方法是什么?

我在这里查看了大多数库https://github.com/search?q=swiftui+drawer但它们都没有使用可以拖动视图的 ScrollView 来实现它们的抽屉。

我还尝试将自定义 UIScrollView 实现为 UIViewRepresentable 并尝试调整 scrollViewWillBeginDragging() 但我无法使其工作。

4

5 回答 5

1

以下用于在整个应用程序中应用

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    UIScrollView.appearance().bounces = false
}
于 2021-10-19T16:00:13.097 回答
0

检查SheeKit库,其中本机工作表支持该行为。

您可以在媒体上阅读此故事中的实施。此外,您可以在故事的结尾找到演示视频。

如果您需要支持内容偏移跟踪和其他类似 UIKit 的可配置性的高级原生 SwiftUI 滚动视图,请查看SolidScroll库及其背后的故事。

于 2021-10-20T21:38:31.993 回答
0

好的,我在自己开发抽屉包时遇到了这个问题,我相信我能够使用 legacyUIscrollViewUIViewRepresentablewrapper 解决它。

如果您想使用之前已经拥有的软件包,我最终会这样做:

在我的抽屉里,我添加了这个LegacyScrollView包装器。

    LegacyScrollView(.vertical, showsIndicators: showsIndicators) {
        content
    }
    .onDragShouldBegin { pan, scrollView in
        /// touch shouldn't begin when scrolling past zero content offset
        scrollView.contentOffset.y - pan.translation(in: scrollView).y > 0
    }

使用这个包装器,我可以访问 UIScrollViewgestureRecognizerShouldBegin(_:)并通过 SwiftUI 修饰符覆盖它

结果

于 2022-02-17T22:32:02.227 回答
0

我遇到了同样的问题并遇到了FloatingPanel包。该 repo 包含一个将其应用于 SwiftUI 应用程序的示例。

于 2021-10-20T13:07:36.783 回答
0
struct ContentView: View {
init() {
    UIScrollView.appearance().bounces = false
}
var body: some View {
    ZStack {
        DraggableView()
        ScrollView {
            LazyVStack {
                Text("Hello World")
            }
        }
    }
}
}
于 2021-10-19T16:22:37.467 回答