使用.signature(长按手势)打破滚动视图



我在Xcode 13.2上使用Swift 5,SwiftUI 3.0。

我有以下代码:

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.0minimumDuration触摸或.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")
}
}
}

相关内容

  • 没有找到相关文章

最新更新