iOS 14 SwiftUI键盘自动提升视图

brccelvz  于 2023-05-16  发布在  Swift
关注(0)|答案(5)|浏览(137)

我在视图中使用TextField,当它成为第一个响应者时,它会离开视图,如下面的GIF所示。
有什么方法可以让我摆脱这种行为吗?

这是我的代码

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

s4n0splo1#

要使.ignoresSafeArea工作,您需要填充所有可用区域(例如:通过使用Spacer)。
以下将不起作用(没有Spacers,只有TextField):

struct ContentView: View {
    @State var text: String = ""
    var body: some View {
        VStack {
            TextField("asd", text: self.$text)
                .textFieldStyle(RoundedBorderTextFieldStyle())
        }
        .ignoresSafeArea(.keyboard, edges: .bottom)
    }
}

但是,当您添加Spacers(填充所有可用空间)时,它将工作

struct ContentView: View {
    @State var text: String = ""
    var body: some View {
        VStack {
            Spacer()
            TextField("asd", text: self.$text)
                .textFieldStyle(RoundedBorderTextFieldStyle())
            Spacer()
        }
        .ignoresSafeArea(.keyboard, edges: .bottom)
    }
}

如果你不想使用Spacers,你也可以使用GeometryReader

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

hiz5n14c2#

您应该对ZStack应用修改器,而不是NavigationView

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

完整工作示例:

struct ContentView: View {
    @State var text = ""
    var body: some View {
        VStack{
            Spacer()
            Text("Hello, World")
            TextField("Tap to test keyboard ignoring", text: $text)
                .textFieldStyle(RoundedBorderTextFieldStyle())
        }
        .padding()
        .ignoresSafeArea(.keyboard, edges: .bottom)
    }
}

ugmeyewa

ugmeyewa3#

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

GeometryReader { _ in
    VStack {
        Spacer()
        TextField("Type something...", text: $value)
        Spacer()
    }.ignoresSafeArea(.keyboard, edges: .bottom)
}

这两个间隔符都是用来垂直居中文本字段的。
只使用GeometryReader或ignoresSafeArea修改器并不能完成这个任务,但是如上所示将它们放在一起之后,最终会阻止视图在键盘出现时向上移动。

a7qyws3x

a7qyws3x4#

这就是我想出来的

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

它似乎为我工作。在这种情况下,您不需要检查iOS 14的可用性。

gc0ot86w

gc0ot86w5#

当我在里面使用NavigationView和Stacks时,我有一个案例,有几个本地“内容”视图。我遇到了和作者一样的麻烦。我的解决方案- GeometryReader但非常重要-在NavigationView里面!代码如下:

NavigationView {
        GeometryReader { _ in
            VStack {
                // below VStacks
                textFieldsGroup
                buttonsGroup
                socialEnterGroup
                    .padding(.top, 40)
                Spacer()
            }
            .padding(.top, 20)
            .navigationTitle("Enter")
            .frame(maxWidth: .infinity, maxHeight: .infinity)
            .padding()
            .ignoresSafeArea(.keyboard, edges: .bottom)
        }
    }

我希望这对某人有帮助。

相关问题