如果从VStack或NavigationItem中调用,则SwiftUI动画会有所不同

时间:2019-06-30 11:19:08

标签: swiftui

我有一个非常简单的VStack,它直接基于Paul Hudson's出色的SwiftUI示例之一。 Text有两行,其中一行是隐藏的。有一种方法可以切换@State var来控制隐藏的Text

如果我从VStack中调用该函数,则该动画会正确设置动画。如果我从navigationBarItems调用它,它将丢失动画。我是否缺少有关视图组成的信息?

struct ContentView: View {
    @State var showDetails = false
    func toggleDetails() { withAnimation { self.showDetails.toggle() } }

    var body: some View {
        NavigationView() {
            VStack {
                Button(action: { self.toggleDetails() }) { Text("Tap to show details") }

                if showDetails { Text("Details go here.") }
            }
            .navigationBarTitle(Text("Nav Bar"))
            .navigationBarItems(trailing: 
               Button(action: { self.toggleDetails() }) {
                    Text("Details")
               })
        }
    }
}

#if DEBUG
struct ContentView_Previews : PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
#endif

Inconsistent Animations

1 个答案:

答案 0 :(得分:0)

我认为它不起作用的原因是因为您正在从视图树的另一个分支调用withAnimation。 “详细信息”按钮和需要设置动画的视图位于层次结构的不同分支上。我只是在猜测,但这似乎得到了我在此处发布的解决方法的支持。

如果您不使用显式动画(即 withAnimation ),而是在VStack和Text上都使用隐式动画,那么它可以工作:

enter image description here

struct ContentView: View {
    @State var showDetails = false
    func toggleDetails() { self.showDetails.toggle() }

    var body: some View {
        NavigationView() {
            VStack {
                Button(action: { self.toggleDetails() }) { Text("Tap to show details") }

                if showDetails {
                    Text("Details go here.").animation(.basic())

                }
            }
            .animation(.basic())
            .navigationBarTitle(Text("Nav Bar"))
            .navigationBarItems(trailing:
                Button(action: {
                    self.toggleDetails()

                }) { Text("Details") })
        }
    }
}