如何在SwiftUI中设置navigationBarHidden动画? struct ContentView:View{ @状态变量hideNavigationBar:Bool=false var body:一些观点{ 导航视图{ 滚动视图{ VStack{ 矩形().填充(颜色.红色).边框(高度:50) .ONTAPPORATE(计数:1,执行:{ 动画片{ self.hideNavigationBar.toggle() } }) VStack{ ForEach(1..

如何在SwiftUI中设置navigationBarHidden动画? struct ContentView:View{ @状态变量hideNavigationBar:Bool=false var body:一些观点{ 导航视图{ 滚动视图{ VStack{ 矩形().填充(颜色.红色).边框(高度:50) .ONTAPPORATE(计数:1,执行:{ 动画片{ self.hideNavigationBar.toggle() } }) VStack{ ForEach(1..,swift,swiftui,hidden,navigationbar,Swift,Swiftui,Hidden,Navigationbar,您可以尝试使用 .navigationBarHidden(hideNavigationBar)。动画(.linear(持续时间:0.5))而不是。navigationBarHidden(hideNavigationBar) 还可以将self.hideNavigationBar.toggle()移出动画块。如果您使用上述方法隐藏带有动画的导航栏,则不需要这样做。我仍在学习SwiftUI中的动画,但在此阶段,我理解您必须为父视图设置动画 所以你的代码会变成 struct ContentView: V

您可以尝试使用

.navigationBarHidden(hideNavigationBar)。动画(.linear(持续时间:0.5))
而不是
。navigationBarHidden(hideNavigationBar)


还可以将self.hideNavigationBar.toggle()移出动画块。如果您使用上述方法隐藏带有动画的导航栏,则不需要这样做。

我仍在学习SwiftUI中的动画,但在此阶段,我理解您必须为父视图设置动画

所以你的代码会变成

struct ContentView: View {
    @State var hideNavigationBar: Bool = false
    
    var body: some View {
        NavigationView {
            ScrollView {
                VStack {
                    Rectangle().fill(Color.red).frame(height: 50)
                        .onTapGesture(count: 1, perform: {
                            withAnimation {
                                self.hideNavigationBar.toggle()
                            }
                        })
                    VStack {
                        ForEach(1..<50) { index in
                            HStack {
                                Text("Sample Text")
                                Spacer()
                            }
                        }
                    }
                }
            }
            .navigationBarTitle("Browse")
            .navigationBarHidden(hideNavigationBar)
        }
    }
}
                    .onTapGesture(count: 1, perform: {
                        self.hideNavigationBar.toggle()
                    })
可以成为

struct ContentView: View {
    @State var hideNavigationBar: Bool = false
    
    var body: some View {
        NavigationView {
            ScrollView {
                VStack {
                    Rectangle().fill(Color.red).frame(height: 50)
                        .onTapGesture(count: 1, perform: {
                            withAnimation {
                                self.hideNavigationBar.toggle()
                            }
                        })
                    VStack {
                        ForEach(1..<50) { index in
                            HStack {
                                Text("Sample Text")
                                Spacer()
                            }
                        }
                    }
                }
            }
            .navigationBarTitle("Browse")
            .navigationBarHidden(hideNavigationBar)
        }
    }
}
                    .onTapGesture(count: 1, perform: {
                        self.hideNavigationBar.toggle()
                    })

简而言之,语法更简单。

我认为,唯一的解决方案是在SwiftUI 2中使用position函数

                    .onTapGesture(count: 1) {
                        self.hideNavigationBar.toggle()
                    }

我仍在学习SwiftUI中的动画…此时此刻,我明白我们必须为父视图设置动画。您是否尝试过将
.animate()
视图修改器应用于
滚动视图
?(我建议将其放置在
导航栏隐藏(hideNavigationBar)下方)
Hey Andrew,你是否在xCode中尝试过你的代码,因为我复制并粘贴了它,但是这种快速的行为仍然存在。@现在你提到了它,请注意……我实际上还没有能够为导航栏设置动画。这是一个常见的问题。我会做更多的研究并更新我的答案-这仍然是我的iOS 14目标中的一个问题……很薄g我已经成功地完成了,并且可以建议,虽然这不是一个解决方案,但是可以在导航栏周围设置元素动画。这会将用户的注意力从导航栏移开。谢谢你的输入。我将它提交给了苹果反馈,你永远不会知道。嘿,安德鲁,你有没有在xCode中尝试你的代码,因为我像你说的那样将行更改为动画,但是我当按下红色矩形时,t仍然显示快速的行为。我确实尝试了代码,它对我来说工作正常。您使用的是什么版本的Xcode。我检查了Xcode 12,不知为什么我需要重新启动。我会将其标记为答案。