首页 > 解决方案 > SwiftUI InputAccessoryView

问题描述

我正在尝试在 SwiftUI 中构建一个聊天视图,并且我想将我的输入视图附加到键盘上,这样当我通过拖动关闭键盘时,我的视图就会随之移动。

当我使用 UIKit 时,我覆盖了 ViewController 的 inputAccessoryView。SwiftUI 是否有类似的可能?

编辑: 我已经看到我可以添加一个 UIKit TextField 并为此文本字段添加一个 InputAccessory。然而,这不是我想要做的。我想在我的 SwiftUI 视图中有一个全局 inputAccessoryView 并将我的自定义输入视图添加为子视图,以便它始终可见,而不是添加到我的 TextField 中。

标签: iosinputswiftuikeyboardinputaccessoryview

解决方案


对于您想要的行为,我看到了两种可能的解决方案。

  1. 在某些情况下,SwiftUI 视图会自动移出键盘
  2. 在 iOS 15 及更高版本中,您可以在 Swiftui 中创建 InputAccessoryView

1:在 swiftUI 中,有几个安全区域,默认情况下视图位于其中。其中之一是键盘安全区域。该区域在键盘隐藏时占据设备的全屏,但在显示键盘时缩小到屏幕的非键盘区域。因此,在下面的示例代码中,文本字段应在出现时移动到键盘上方,并在键盘消失时下拉(当键盘处于较小的浮动模式时,这在 iPad 上不起作用)。

VStack {
    ScrollView {
        ForEach(0 ..< 50) { item in
            Text("Demo Text")
                .frame(maxWidth: .infinity)
        }
            
    }
    TextField("Enter Text", text: $messageText)
}

2:在iOS 15+中,可以在键盘位置创建工具栏。这本质上就像 UIKit 中的 InputAccessoryView 一样。这和方法一的区别在于,这里的视图只有在显示键盘时才会出现。对此的一种解释是,当有线或无线键盘连接到 iPhone 或 iPad 时,工具栏视图仍将显示在屏幕底部。

.toolbar {
    ToolbarItemGroup(placement: .keyboard) {
        Text("Apears at top of keyboard")
    }
}

因此,将 1 和 2 放在一起,这是一个实现两者的示例。您可以在 Xcode 中运行它以帮助了解这两种方法的行为方式

VStack {
    ScrollView {
        ForEach(0 ..< 50) { item in
            Text("Demo Text")
                .frame(maxWidth: .infinity)
        }
            
    }
    TextField("Enter Text", text: $messageText)
}
.toolbar {
    ToolbarItemGroup(placement: .keyboard) {
        Text("Apears at top of keyboard")
    }
}

推荐阅读