如何在没有动画的情况下更改SwiftUI视图@State **

时间:2020-09-28 03:34:28

标签: swift animation swiftui

我有一个视图,可以对外部@ObservedObject的更改做出反应,因此,我正在使用一个隐式动画来动画化当观察到的对象发生更改时发生的更改:

.animation(.easeInOut(duration: 1))

这很好,但是我有问题。

我也希望该视图可拖动,但是当拖动视图时更改偏移状态时,它现在使用该慢速动画。我尝试将动画明确设置为.none或nil,但均无效。

所以我的问题是,如何像highPriotityGesture或类似方法那样,让我的显式动画取代我的隐式动画。在SwiftUI中可以吗?

我正在使用Xcode 12和iOS 14。

这里是一个例子:

import SwiftUI

struct CardView: View {

    @ObservedObject var myObject: MyObject
    @State var translation = CGSize(width: 0, height: 0)

    var body: some View {
        ZStack {
            RoundedRectangle(cornerRadius: 12)
            Text(myObject.someVal)
        }
        .animation(.easeInOut(duration: 1))
        .offset(x: translation.width, y: translation.height)
        .gesture(
            DragGesture()
                .onChanged { value in
                    withAnimation(nil) {
                        // I don't want this to be animated!
                        translation = value.translation
                    }
                }
                .onEnded { _ in
                    // I'd preferably like to also animate this with .spring() and ignore the implicit animation
                    withAnimation(.spring()) {
                        translation = .zero
                    }
                }
         )
    }
}

谢谢!

1 个答案:

答案 0 :(得分:1)

加入隐式动画,其值只能是可动画的(这样它就不会对不相关的偏移量做出反应),例如

ZStack {
    RoundedRectangle(cornerRadius: 12)
    Text(myObject.someVal)
}
.animation(.easeInOut(duration: 1), value: myObject.someVal)  // << here !!