iOS 14 SwiftUI键盘自动提升视图

iOS 14 SwiftUI键盘自动提升视图,swift,keyboard,swiftui,textfield,ios14,Swift,Keyboard,Swiftui,Textfield,Ios14,我在视图中使用TextField,当它成为第一个响应者时,它会离开视图,如下图所示 我有没有办法摆脱这种行为 这是我的密码 NavigationView(content: { ZStack{ MyTabView(selectedIndex: self.$index) .view(item: self.item1) { NewView(title: "Hello1").navigationBarT

我在视图中使用TextField,当它成为第一个响应者时,它会离开视图,如下图所示

我有没有办法摆脱这种行为

这是我的密码

NavigationView(content: {
    ZStack{
        MyTabView(selectedIndex: self.$index)
            .view(item: self.item1) {
                NewView(title: "Hello1").navigationBarTitle("")
                    .navigationBarHidden(true)
            }
            .view(item: self.item2) {
                NewView(title: "Hello2").navigationBarTitle("")
                    .navigationBarHidden(true)
            }
            .view(item: self.item3) {
                NewView(title: "Hello3").navigationBarTitle("")
                    .navigationBarHidden(true)
            }
    }.navigationBarHidden(true)
    .navigationBarTitle("")
}).ignoresSafeArea(.keyboard, edges: .bottom)
//新观点

struct NewView:View {
    @State var text:String = ""
    var title:String
    var body: some View {
        VStack {
            Spacer()
            Text("Hello")
            TextField(title, text: self.$text)
                .textFieldStyle(RoundedBorderTextFieldStyle())
            
        }.padding()
        .onAppear {
            debugPrint("OnApper \(self.title)")
        }
    }
}

您应该在
ZStack
上应用修饰符,而不是
NavigationView

NavigationView(content: {
    ZStack{
        ,,,
    }.navigationBarHidden(true)
    .navigationBarTitle("")
    .ignoresSafeArea(.keyboard, edges: .bottom) // <- This line moved up
})

您应该在
ZStack
上应用修饰符,而不是
导航视图

NavigationView(content: {
    ZStack{
        ,,,
    }.navigationBarHidden(true)
    .navigationBarTitle("")
    .ignoresSafeArea(.keyboard, edges: .bottom) // <- This line moved up
})

我就是这么想的:

GeometryReader { _ in
    ZStack {
        //PUT CONTENT HERE
    }.frame(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
}

这似乎对我有用。在这种情况下,您不需要检查iOS 14的可用性。

这就是我的想法:

GeometryReader { _ in
    ZStack {
        //PUT CONTENT HERE
    }.frame(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
}

这似乎对我有用。在这种情况下,您不需要检查iOS 14的可用性。

对于
。要工作,您需要填充所有可用区域(例如,使用
垫片


以下将不起作用(没有空格,只有一个文本字段):


但是,当您添加垫片(填充所有可用空间)时,将起作用:


如果不想使用垫片,也可以使用
GeometryReader

struct ContentView: View {
    @State var text: String = ""
    var body: some View {
        GeometryReader { _ in
            ...
        }
        .ignoresSafeArea(.keyboard, edges: .bottom)
    }
}

要使
.ignoresSafeArea
正常工作,您需要填充所有可用区域(例如,使用
垫片


以下将不起作用(没有空格,只有一个文本字段):


但是,当您添加垫片(填充所有可用空间)时,将起作用:


如果不想使用垫片,也可以使用
GeometryReader

struct ContentView: View {
    @State var text: String = ""
    var body: some View {
        GeometryReader { _ in
            ...
        }
        .ignoresSafeArea(.keyboard, edges: .bottom)
    }
}

结合此处发布的答案,并考虑以下内容(Xcode 12.4,iOS 14.4),最终对我有效:

两个间隔符都用于垂直居中文本字段


仅使用GeometryReader或ignoresSafeArea修改器并没有起到作用,但在将它们按上图所示组合在一起后,最终阻止了视图在键盘外观上向上移动。

最终对我起作用的是,结合此处发布的答案并考虑以下内容(Xcode 12.4,iOS 14.4):

两个间隔符都用于垂直居中文本字段


仅使用GeometryReader或
ignoresSafeArea
修饰符并没有起到作用,但在将它们按上图所示组合在一起后,最终阻止了视图在键盘外观上向上移动。

为什么要取消该行为?如果您不提升文本字段,它会被键盘覆盖,您无法分辨您正在键入的内容,或者使用点击/拖动手势来更改选择。这使得编辑无法使用。你为什么要摆脱这种行为?如果您不提升文本字段,它会被键盘覆盖,您无法分辨您正在键入的内容,或者使用点击/拖动手势来更改选择。这使得编辑无法使用。修改器根本不起作用。文本字段仍向上移动..:(可能您错过了最初的代码实现。我添加了一个完整的代码演示以使其可复制;)如果我在视图中包含一些行,如下所示:
ScrollView{LazyVStack{rows…}
使用
ignoresSafeArea
将导致行中闪烁,这是明显的,并且使修改器无法工作。文本字段仍向上移动..:(可能您错过了最初的代码实现。我添加了一个完整的代码演示以使其可复制;)如果我在视图中包含一些行,如下所示:
ScrollView{LazyVStack{rows…}
使用
ignoresSafeArea
将导致行中闪烁,这是显而易见的,并且会使您感到烦恼。如果您使用此修改器,则它将无法工作。(.edgesIgnoringSafeArea(.all))如果你有这个修改器,它就不起作用了。(.边缘识别安全区域(.all))
GeometryReader { _ in
    VStack {
        Spacer()
        TextField("Type something...", text: $value)
        Spacer()
    }.ignoresSafeArea(.keyboard, edges: .bottom)
}