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

标签 swiftui

我有一个非常简单的 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

Inconsistent Animations

最佳答案

Beta 5 更新

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


beta 4 和之前版本的解决方法

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

如果您不使用显式动画(即 withAnimation),而是在 VStack 和文本上使用隐式动画,它会起作用:

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") })
        }
    }
}

关于如果从 VStack 或 NavigationItem 中调用,SwiftUI 动画会有所不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56824432/

相关文章:

ios - 如何从结构 View 数组中提取状态? SwiftUI

watchos - 使用 SwiftUI 的 subview 宽度相等

macos - 如何在 MacOS 的 SwiftUI 中向 TextFields 添加建议(参见下面的 gif)?

ios - 使用自定义按钮扩展 SwiftUI 键盘

swift - 如何将完成 block 添加到 SwiftUI .alert(isPresented)

ios - 可以在 SwiftUI 中实现 `ScrollView` 交互式键盘关闭吗?

ios - SwiftUI 不能正确评估 elseif?

swiftui - VStack 围绕图像间距,但不围绕文本

从核心数据设置的 SwiftUI 列表

ios - SwiftUI 将 VStack/HStacks 对齐到一个表中