如果从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似乎解决了这个问题。