使用 DragGesture 移动视图,同时在顶部有一个 ScrollView

Posted

技术标签:

【中文标题】使用 DragGesture 移动视图,同时在顶部有一个 ScrollView【英文标题】:Moving view with DragGesture while having a ScrollView on top 【发布时间】:2021-05-02 15:03:58 【问题描述】:

我有一个用户可以拖动的视图。此视图包含一个显示信息列表的 ScrollView。但是,此视图会干扰包含视图的 DragGesture。

预期的行为是,只有当用户实际可以滚动某些内容时,ScrollView 的手势才会优先于容器。

这是可以用来测试我所指问题的代码:

struct MultipleDrag: View 
    
    @GestureState private var offset: CGFloat = 0
    
    private var gesture: some Gesture 
        DragGesture()
            .updating($offset)  value, state, transaction in
                state = -value.translation.height
            
    
    var body: some View 
        VStack 
            
            ScrollView 
                ForEach(1...20, id: \.self)  val in
                    Text(String(val))
                        .padding()
                
            
            .background(Color.green)
            .cornerRadius(10)
            .padding()
        
        .frame(height: 200)
        .background(Color.orange)
        .cornerRadius(10)
        .offset(y: -offset)
        .gesture(gesture)
    

如您所见,默认情况下,滚动视图从顶部开始。这意味着如果用户向下滑动,橙色容器应该向下移动,即使手势发生在绿色区域 (ScrollView) 中。当到达 ScrollView 的底部或滚动视图上没有足够的内容来实际滚动时,也会发生同样的情况。

有什么想法吗?

【问题讨论】:

【参考方案1】:

我认为你可以使用这个修饰符:

.highPriorityGesture(Gesture)

这将使手势比其他手势具有更高的优先级。

【讨论】:

恐怕不行。 ScrollView 仍然优先于拖动手势。

以上是关于使用 DragGesture 移动视图,同时在顶部有一个 ScrollView的主要内容,如果未能解决你的问题,请参考以下文章

在触发不同的 DragGesture 之前,SwiftUI DragGestures 不会更新

如何移动子视图控制器,同时使用自动布局而不是框架隐藏状态栏?

ScrollView 限制 DragGesture 动画

如何在 SwiftUI 中实现触发 switch case 的左或右 DragGesture()?

DragGesture 打破工作表的滑动手势

设置具有优先级约束的标签位置?