我在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中有一个按钮,即:
- 接受0.0
minimumDuration
触摸或.gesture().onChange
- 仍可在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")
}
}
}