为什么这个SwiftUI视图没有动画?

时间:2019-07-13 15:37:47

标签: swift swiftui

我想在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

2 个答案:

答案 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

Runnable example via Github: SwiftUIPlayground