【问题标题】:SwiftUI: ScrollView that drags bottom sheet with itSwiftUI:使用它拖动底部工作表的 ScrollView
【发布时间】:2021-10-19 15:48:16
【问题描述】:

我正在尝试创建一个 SwiftUI 滚动视图,它可以像这样拖动其容器:https://drive.google.com/file/d/1O92DgsVI1OjM1HEUXUwVywB8gcdShOP-/view?usp=sharing

许多 Apple 应用程序都使用此功能(Apple 地图、音乐、钱包等),但我还没有找到使用 SwiftUI 的简单方法。您认为实现这一点的最佳方式是什么?

我查看了https://github.com/search?q=swiftui+drawer 此处的大多数库,但它们都没有实现抽屉,其中包含可以拖动视图的 ScrollView。

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

【问题讨论】:

  • 我也遇到了同样的问题,你找到解决办法了吗?

标签: ios swiftui swiftui-list swiftui-scrollview draggesture


【解决方案1】:

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

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    UIScrollView.appearance().bounces = false
}

【讨论】:

  • 我正在寻找 SwiftUI ScrollView 的解决方案,而不是 UIScrollView。
  • @blrsk 请通过这个答案stackoverflow.com/questions/58799474/…
  • 以上代码也可以。但这适用于整个应用程序。
  • 这对我不起作用
【解决方案2】:
struct ContentView: View {
init() {
    UIScrollView.appearance().bounces = false
}
var body: some View {
    ZStack {
        DraggableView()
        ScrollView {
            LazyVStack {
                Text("Hello World")
            }
        }
    }
}
}

【讨论】:

  • 这对我不起作用
  • 以上代码在我的最后工作。我认为 DraggableView() 中存在问题。请立即评论该代码,然后检查。
  • 我用整个文件更新了问题。
  • 感谢您抽出宝贵时间回答!最好能解释一下你的答案,而不仅仅是代码。
  • 这不起作用。还没有有效的答案
【解决方案3】:

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

您可以在 medium 上阅读有关实现 in this story 的信息。此外,您可以在故事的结尾找到演示视频。

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

【讨论】:

  • 感谢分享!看起来很有希望。我去看看。
【解决方案4】:

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

【讨论】:

  • 感谢分享!看起来很有希望。我去看看。
【解决方案5】:

好的,我在自己开发 drawer package 时遇到了这个问题,我相信我能够使用旧的 UIscrollViewUIViewRepresentable 包装器解决它。

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

在我的抽屉里,我添加了这个 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
    }

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

Result

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    相关资源
    最近更新 更多