SwiftUI不使用Xcode 12键盘推送导航

SwiftUI不使用Xcode 12键盘推送导航,swiftui,Swiftui,我制作了一个简单的应用程序来说明这个问题。我有一个自定义的选项卡视图,但是当我点击文本字段并打开键盘时,我的导航选项卡也被向上推。我希望导航不可见(正如任何应用程序所期望的那样) 此图说明了问题: 如果使用本机选项卡视图,则不会出现此问题,但我希望使用自定义选项卡。有人知道怎么处理吗?提供下面的代码 struct ContentView: View { @State var menu = 0 var body: some View { VStack {

我制作了一个简单的应用程序来说明这个问题。我有一个自定义的选项卡视图,但是当我点击文本字段并打开键盘时,我的导航选项卡也被向上推。我希望导航不可见(正如任何应用程序所期望的那样)

此图说明了问题:

如果使用本机
选项卡视图
,则不会出现此问题,但我希望使用自定义选项卡。有人知道怎么处理吗?提供下面的代码

struct ContentView: View {
    @State var menu = 0
    
    var body: some View {
        VStack {
            
            VStack {
                if menu == 0 {
                    FirstPage()
                } else if menu == 1 {
                    Text("all is good")
                }
            }
            .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
            
            CustomTabs(menu: $menu)
        }
    }
}

struct CustomTabs: View {
    @Binding var menu: Int
    var body: some View {
        HStack {
            Spacer()
            Text("Nav1")
                .onTapGesture{
                    self.menu = 0
                }
            Spacer()
            Text("Nav2")
                .onTapGesture{
                    self.menu = 1
                }
            Spacer()
        }
        .padding()
        .background(Color(.red))
    }
}

struct FirstPage: View {
    @State var mood: String = ""
    
    var body: some View {
        VStack {
            Text("How are you?")
            TextField("answer textfield", text: $mood)
        }
    }
}

一个可能的解决方案/解决办法是将
自定义选项卡
嵌入
VStack
中,使用
垫片
,即使在键盘出现时也会向下推动选项卡,然后通过
ZStack
将此堆栈放在视图前面

struct ContentView: View {
    @State var menu = 0
    
    var body: some View {
        ZStack {
            
            VStack {
                if menu == 0 {
                    FirstPage()
                } else if menu == 1 {
                    Text("all is good")
                }
            }
            .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
            
            VStack {
                Spacer(minLength: UIScreen.main.bounds.height - 70)
                CustomTabs(menu: $menu)
                    .frame(height: 70)
            }
        }
    }
}

为了简单起见,我刚刚决定将标签高度设置为70。一个更漂亮的解决方案是使用GeometryReader。

一个可能的解决方案/解决方法是将
自定义选项卡
嵌入
VStack
中,使用
间隔符
,即使在键盘出现时也会向下推动选项卡,然后通过
ZStack
将该堆栈放在视图前面

struct ContentView: View {
    @State var menu = 0
    
    var body: some View {
        ZStack {
            
            VStack {
                if menu == 0 {
                    FirstPage()
                } else if menu == 1 {
                    Text("all is good")
                }
            }
            .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
            
            VStack {
                Spacer(minLength: UIScreen.main.bounds.height - 70)
                CustomTabs(menu: $menu)
                    .frame(height: 70)
            }
        }
    }
}

为了简单起见,我刚刚决定将标签高度设置为70。一个更漂亮的解决方案是使用GeometryReader。

有趣的解决方案!然而,若我将ScrollView和content=/有趣的解决方案放在VStack中,它似乎就不起作用了!然而,若我将ScrollView和内容放在VStack中,它似乎不起作用=/