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

如果从VStack或NavigationItem中调用,则SwiftUI动画会有所不同,swiftui,Swiftui,我有一个非常简单的VStack,直接基于一个优秀的SwiftUI示例。有两行文本,一行隐藏。有一种方法可以切换控制隐藏的文本的@状态变量 如果我从VStack中调用该函数,它将正确设置动画。如果我从navigationBarItems调用它,它将丢失动画。我是否遗漏了一些关于视图如何组成的信息 struct ContentView: View { @State var showDetails = false func toggleDetails() { withAnimation

我有一个非常简单的
VStack
,直接基于一个优秀的SwiftUI示例。有两行
文本
,一行隐藏。有一种方法可以切换控制隐藏的
文本的
@状态变量

如果我从
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

Beta 5更新版 beta 5似乎解决了这个问题。不再需要解决方法


beta 4及以前版本的解决方案

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

如果在VStack和文本上都使用隐式动画,而不是使用显式动画(即带动画的),则它可以工作:

struct ContentView:View{
@状态变量showDetails=false
func toggleDetails(){self.showDetails.toggle()}
var body:一些观点{
导航视图(){
VStack{
按钮(操作:{self.toggleDetails()}{Text(“点击以显示详细信息”)}
如果显示详细信息{
文本(“详细信息在此显示”).animation(.basic())
}
}
.animation(.basic())
.navigationBarTitle(文本(“导航栏”))
.navigationBarItems(尾部:
按钮(操作:{
self.toggleDetails()
}){文本(“详细信息”)})
}
}
}

更新了答案,因为beta 5似乎解决了这个问题。