【问题标题】:iOS 16 keyboard safe area not updated on pushiOS 16 键盘安全区域未在推送时更新
【发布时间】:2022-09-26 15:37:41
【问题描述】:

推送新屏幕时,iOS 16 上有一个奇怪的键盘问题。当您从推送的屏幕返回时,键盘安全区域似乎没有更新。

它甚至可以在一个空项目上用这段代码重现:

struct ContentView: View {
    
    @State var text = \"\"
    
    var body: some View {
        NavigationView {
            VStack {
                Spacer()
                NavigationLink {
                    Text(\"test\")
                } label: {
                    Text(\"Tap me\")
                }
                TextField(\"\", text: $text)
                    .textFieldStyle(.roundedBorder)
            }
            .padding()
        }
    }
}

重现步骤:

  • 打开键盘
  • 按下按钮“点击我”并导航到另一个屏幕
  • 快速返回上一屏幕
  • 键盘已关闭,但存在适合键盘尺寸的较大间隙。

其他人有类似的问题吗?

  • 我有一个类似的问题,在键盘被全部关闭后空间没有被重复使用,要么向后滑动但中途取消它,要么在显示键盘的工作表上向下滑动。这从 iOS 16 开始发生,即使应用程序是使用 iOS 15 SDK 构建的。

标签: ios swiftui keyboard ios16


【解决方案1】:

我找到了一个临时的解决方法,它不是很漂亮,但它可以删除以前被键盘占用的空白空间。解决方案是从onDisappear 中的子视图调用父视图,然后在父视图中有一个隐藏的 TextField,它是聚焦的并且几乎立即没有聚焦。

在父视图中添加属性:

@State private var dummyText = ""
@FocusState private var dummyFocus: Bool

并在父视图中的某处放置一个 TextField,例如在 ZStack 中:

ZStack {
    TextField("", text: $dummyText)
        .focused($dummyFocus)
        .opacity(0.01)

    ... your other layout ...
}

然后使用完成块调用/导航到子视图,如下所示:

ChildView(didDismiss: {
    if #available(iOS 16.0, *) {
        dummyFocus = true
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
            dummyFocus = false
        }
    }
})

在子视图中添加属性:

var didDismiss: () -> Void

并在孩子的 onDisappear 中调用完成块:

.onDisappear {
    didDismiss()
}

onDisappeardidDismiss() 只会在整个交互式滑动动画完成后调用。该代码检查 iOS 16,以便它不会在以前的版本上不必要地执行。

【讨论】:

    猜你喜欢
    • 2018-01-06
    • 2020-07-21
    • 1970-01-01
    • 2022-01-21
    • 2020-11-26
    • 2021-01-05
    • 2020-06-12
    • 2018-03-22
    • 1970-01-01
    相关资源
    最近更新 更多