【发布时间】:2021-01-06 03:07:17
【问题描述】:
iOS13 发现 TextField 没有任何类型的键盘回避处理。因此,我们创建了如何运作良好的键盘回避机制。我们升级到 iOS14,这导致 TextFields 内置了键盘回避功能。但是,键盘回避功能似乎没有按预期工作。
问题 1 我们遇到的第一个问题是在屏幕中心及其周围的 TextFields 无法正常工作。鉴于此代码:
struct ContentView: View {
@State var text:String = ""
var body: some View {
TextField("Testing", text: $text)
}
}
在 iPhone 8 Plus 上,文本字段向上移动。我们认为这不应该发生,因为 TextField 不会被键盘隐藏,因此它应该保留在同一个位置。
问题 1: 这是一个错误,是否应该向 Apple 报告?我们认为这是一个错误/问题。
我们发现使用以下方法:
struct ContentView: View {
@State var text:String = ""
var body: some View {
VStack {
Spacer()
TextField("Testing", text: $text)
}
}
}
TextField 将移动到键盘上方。这是预期的行为。我们还通过以下代码发现了这一点:
struct ContentView: View {
@State var text:String = ""
var body: some View {
VStack {
TextField("Testing", text: $text)
Spacer()
}
}
}
TextField 不会被移动,因为它永远不会被 TextField 覆盖。再一次,这是我们所期望的行为。但是,屏幕中心及其周围的任何 TextField 似乎键盘避让会将 TextField 移动到不应该出现的场景中。
问题 2
我们的应用程序在某些屏幕的中心及其周围保留了 TextField,因此上面发现的问题只会增加糟糕的用户体验,因此我们希望“关闭”提供给我们的这种键盘避免功能。我们希望使用ignoresSafeArea 修饰符,如下所示:
struct ContentView: View {
@State var text:String = ""
var body: some View {
if #available(iOS 14.0, *) {
VStack {
TextField("Testing", text: $text)
}
.ignoresSafeArea(.keyboard, edges: .bottom)
} else {
// Fallback on earlier versions
// Our iOS13 Code
}
}
}
观察到的结果是修饰符根本不起作用。 TextField 仍然向上移动。但是,当使用这样的东西时:
struct ContentView: View {
@State var text:String = ""
var body: some View {
if #available(iOS 14.0, *) {
VStack {
Spacer()
TextField("Testing", text: $text)
}
.ignoresSafeArea(.keyboard, edges: .bottom)
} else {
// Fallback on earlier versions
// Our iOS13 Code
}
}
}
ignoresSafeArea 有效,因此引出了第二个问题:
问题 2
ignoresSafeArea 修饰符是否也有错误?这是应该报告的事情吗?
屏幕中心及其周围的 TextField 似乎存在潜在问题?
问题 3 有人知道解决这些问题的方法吗?因为现在它在 iOS14 上是个大问题。键盘回避不起作用,任何尝试关闭它的尝试也不起作用。
我们使用的是 Xcode 12.0 (12A7209)
更新
我们发现将 TextField 包装在 Geometry Reader 中似乎会“关闭”TextField 的键盘避免功能。然而,我们认为这是一个令人愉快的 hack,它以一种方式解决了问题,但同时也暴露了键盘避免在几何阅读器中不起作用,这对其他人来说可能是一个错误/问题......
struct ContentView: View {
@State var text:String = ""
var body: some View {
if #available(iOS 14.0, *) {
GeometryReader { _ in
VStack {
Spacer().frame(height:500) //Compensate for other Views in the Stack
TextField("Testing", text: $text)
}
}
} else {
// Fallback on earlier versions
// Our iOS13 Code
}
}
}
【问题讨论】:
-
我们遇到了同样的问题。我们在屏幕顶部有一个文本字段,当键盘打开时它会一直滚动到视图之外。请注意,将 .ignoresSafeArea(.keyboard, edges: .bottom) 放在 App 结构中的 ContentView() 行似乎有点帮助,但并不完全。