我想在DragGesture
的预测位置放置一个视图,这就是我在.gestureEnded
闭包中所做的,将更改包装在withAnimation
块中。但是,当我在实时视图中尝试该更改时,该更改不会显示动画。
这是框架的错误还是我做错了什么?
import SwiftUI
struct MyList: View {
@State var ty: CGFloat = 0
var dragGesture: some Gesture {
DragGesture()
.onChanged { theGesture in
self.ty = theGesture.translation.height
print("Changed")
}
.onEnded { theGesture in
print("Ended")
withAnimation(.basic(duration: 3, curve: .easeOut)) {
self.ty = theGesture.predictedEndTranslation.height
}
}
}
var body: some View {
VStack {
ForEach(1...5) { i in
Rectangle()
.background(Color.red)
.frame(minHeight: 20, maxHeight: 100)
.relativeWidth(1)
.padding(0)
}
}.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
.transformEffect(.init(translationX: 0, y: ty))
.gesture(dragGesture)
}
}
struct ContentView : View {
var body: some View {
MyList()
}
}
#if DEBUG
struct ContentView_Previews : PreviewProvider {
static var previews: some View {
ContentView()
}
}
#endif
答案 0 :(得分:2)
似乎translateEffect
无法设置动画。因为CGAffineTransform不符合Animatable
,所以这很有道理,因此可能是预期的。幸运的是,您仍然可以使用.offset(x: 0, y: ty)
。
这对您有用吗?
请注意,某些动画(如该动画)在Xcode Live Preview中不起作用。您需要在设备或模拟器上运行它。
答案 1 :(得分:0)
SwiftUI / iOS 13.4效果的示例实现,还修复了反复拖动时跳动的视图。
诀窍是使用r[-i-1] becomes
修饰符来应用which is
来跟踪正在进行的手势并保持整体状态的变化,
@GestureState