我有一个非常简单的 VStack
,直接基于 Paul Hudson's 之一优秀的 SwiftUI 示例。有两行Text
,其中一行是隐藏的。有一种方法可以切换控制隐藏的Text
的@State var
。
如果我从 VStack
中调用该函数,它会正常运行。如果我从 navigationBarItems
调用它,它会丢失动画。我是否遗漏了有关 View 如何构成的信息?
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 和之前版本的解决方法
我认为它不起作用的原因是因为您从 View 树的不同分支调用 withAnimation。 “详细信息”按钮和需要动画的 View 位于层次结构的不同分支上。我只是在猜测,但它似乎得到了我在此处发布的解决方法的支持。
如果您不使用显式动画(即 withAnimation),而是在 VStack 和文本上使用隐式动画,它会起作用:
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") })
}
}
}
关于如果从 VStack 或 NavigationItem 中调用,SwiftUI 动画会有所不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56824432/