我有一个非常简单的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
答案 0 :(得分:0)
我认为它不起作用的原因是因为您正在从视图树的另一个分支调用withAnimation。 “详细信息”按钮和需要设置动画的视图位于层次结构的不同分支上。我只是在猜测,但这似乎得到了我在此处发布的解决方法的支持。
如果您不使用显式动画(即 withAnimation ),而是在VStack和Text上都使用隐式动画,那么它可以工作:
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") })
}
}
}