使用 .gesture(LongPressGesture) 打破滚动视图

Using .gesture(LongPressGesture) break the Scrollview

我正在使用 Swift 5,SwiftUI 3.0 Xcode 13.2.

我有以下代码:

  ZStack { ... custom button }
 .gesture(LongPressGesture(minimumDuration: 0.5, maximumDistance: 30)
        .onEnded { _ in
                withAnimation(.easeInOut(duration: 1.0)) {
                    // code when ended...
                }
        }
        .onChanged { _ in
            withAnimation(.easeInOut(duration: 0.2)) {
                // code when touched...
            }
            
        })

我们称其为 CustomButton

然后我有了这个 ScrollView 和 LazyVGrid:

ScrollView {
    VStack(spacing: 15) {
           let columns = Array(repeating: GridItem(.flexible(), spacing: 10), count: 1)

           LazyVGrid(columns: columns,spacing: 15) {
               CustomButton()
               CustomButton()
               // and then some more...
           }
    } 
}

现在,当我从 CustomButton 中删除 onChange 处理程序时,滚动工作正常。所以我猜测,由于 onChange() 在我点击按钮后立即触发,因此它优先于 ScrollView。但是,我需要在 onChange() 被触发后或用户触摸按钮后发生的动画。

我试过在 .gesture() 修饰符之前有一个空的 .onTapGesture {}。 我试过将 .gesture 更改为 .simulatenousGesture 我已经尝试了在 SO 或 AppleDev 论坛上可以找到的大部分内容。

我想知道是否可以在 ScrollView 中添加一个按钮,即:

  1. 接受 0.0 minimumDuration 触摸,或 .gesture().onChange
  2. 在 ScrollView 中仍可滚动

任何帮助将不胜感激,谢谢!

这个变体有效(不要问我为什么...):

struct CustomButton: View {
    var body: some View {
        RoundedRectangle(cornerRadius: 15)
            .frame(height: 50)
        
            .onTapGesture {
                print("tapped")
            }
        
            .onLongPressGesture(minimumDuration: 0.5, maximumDistance: 30) {
                print("longpress ended")
            } onPressingChanged: { pressing in
                print("longpress changed")
            }
    }
}