在SwiftUI视图上为Dragesture的预测翻译设置动画

在SwiftUI视图上为Dragesture的预测翻译设置动画,swift,swiftui,Swift,Swiftui,我想在DragGesture的预测位置放置一个视图,这就是我在中所做的。gestureEnded闭包,用动画将更改包装在块中。然而,当我在live view中尝试时,变化并没有被激活 这是框架的缺陷还是我做错了什么 struct ContentView:View{ @状态变量ty:CGFloat=0 瓦尔·德拉格斯特尔:一些手势{ 德拉格斯特尔() .一旦改变{中的手势 self.ty=thesignature.translation.height 打印(“更改”) } .onEnded{中的手

我想在
DragGesture
的预测位置放置一个视图,这就是我在
中所做的。gestureEnded
闭包,用动画将更改包装在
块中。然而,当我在live view中尝试时,变化并没有被激活

这是框架的缺陷还是我做错了什么

struct ContentView:View{
@状态变量ty:CGFloat=0
瓦尔·德拉格斯特尔:一些手势{
德拉格斯特尔()
.一旦改变{中的手势
self.ty=thesignature.translation.height
打印(“更改”)
}
.onEnded{中的手势
打印(“结束”)
withAnimation(Animation.easeOut(持续时间:3)){
self.ty=thesignature.predicteddtransation.height
}
}
}
var body:一些观点{
VStack{
ForEach(1..<5){in
颜色:红色
.帧(最小高度:20,最大高度:100)
.填充(0)
}
}
.transformEffect(.init(translationX:0,y:ty))
.手势(德拉格斯特尔)
}
}
结构内容视图\u预览:PreviewProvider{
静态var预览:一些视图{
ContentView()
}
}

似乎
translateEffect
无法设置动画。这有点道理,因为CGAffineTransform不符合
可设置动画的
,所以这可能是预期的。幸运的是,您仍然可以使用
.offset(x:0,y:ty)

那对你有用吗


请注意,某些动画(如本动画)在Xcode Live Preview中不起作用。您需要在设备或模拟器上运行它。

似乎
translateEffect
无法设置动画。这有点道理,因为CGAffineTransform不符合
可设置动画的
,所以这可能是预期的。幸运的是,您仍然可以使用
.offset(x:0,y:ty)

那对你有用吗


请注意,某些动画(如本动画)在Xcode Live Preview中不起作用。您需要在设备或模拟器上运行它。

这是SwiftUI/iOS 13.4效果的一个示例实现,还修复了反复拖动时视图跳转的问题

诀窍是使用
@GestureState
跟踪正在进行的手势,并单独保持整体状态更改,使用
。offset
修饰符应用更改:

struct DragGestureView:视图{
@GestureState变量dragOffset=CGSize.zero
@状态变量偏移量:CGFloat=0
瓦尔·德拉格斯特尔:一些手势{
德拉格斯特尔()
.正在更新($dragOffset){value,state,uu\in
state=value.translation
}
.onEnded{在
//保持偏移已在没有动画的情况下移动
self.offset+=手势.平移.高度
withAnimation(Animation.easeOut(持续时间:3)){
self.offset+=sipple.predictededTranslation.height-sipple.translation.height
}
}
}
var body:一些观点{
VStack{
ForEach(1..<5){in
颜色:红色
.帧(最小高度:20,最大高度:100)
}
}
.偏移量(x:0,y:offset+dragOffset.高度)
.手势(德拉格斯特尔)
}
}
结构DragGestureView\u预览:预览提供程序{
静态var预览:一些视图{
DragGestureView()
}
}

SwiftUI/iOS 13.4效果的一个示例实现,还修复了反复拖动时视图跳跃的问题

诀窍是使用
@GestureState
跟踪正在进行的手势,并单独保持整体状态更改,使用
。offset
修饰符应用更改:

struct DragGestureView:视图{
@GestureState变量dragOffset=CGSize.zero
@状态变量偏移量:CGFloat=0
瓦尔·德拉格斯特尔:一些手势{
德拉格斯特尔()
.正在更新($dragOffset){value,state,uu\in
state=value.translation
}
.onEnded{在
//保持偏移已在没有动画的情况下移动
self.offset+=手势.平移.高度
withAnimation(Animation.easeOut(持续时间:3)){
self.offset+=sipple.predictededTranslation.height-sipple.translation.height
}
}
}
var body:一些观点{
VStack{
ForEach(1..<5){in
颜色:红色
.帧(最小高度:20,最大高度:100)
}
}
.偏移量(x:0,y:offset+dragOffset.高度)
.手势(德拉格斯特尔)
}
}
结构DragGestureView\u预览:预览提供程序{
静态var预览:一些视图{
DragGestureView()
}
}

嗨,特雷弗,你的.onChange()已经翻译了你的视图。onChange()只是用来调试的吗?@kontiki嘿!对不起,我犯了一个错误,我想使用手势.predictedEndTranslation.height。更新了问题无忧,发布了答案。顺便说一句,有些动画在Xcode的实时预览中不起作用。您需要在设备或模拟器上运行。嗨,Trevor,.onChange()已经翻译了您的视图。onChange()只是用来调试的吗?@kontiki嘿!对不起,我犯了一个错误,我想使用手势.predictedEndTranslation.height。更新了问题无忧,发布了答案。顺便说一句,有些动画在Xcode的实时预览中不起作用。您需要在设备或模拟器上运行。谢谢,我还没有找到
.offset
。我的问题是它甚至在我的设备上也没有动画。当我看到你说它在Xcode Live Preview中不起作用时,我没想到它也适用于设备上的Live Preview…所以现在我直接运行了它