ios - SwiftUI InputAccessoryView
问题描述
我正在尝试在 SwiftUI 中构建一个聊天视图,并且我想将我的输入视图附加到键盘上,这样当我通过拖动关闭键盘时,我的视图就会随之移动。
当我使用 UIKit 时,我覆盖了 ViewController 的 inputAccessoryView。SwiftUI 是否有类似的可能?
编辑: 我已经看到我可以添加一个 UIKit TextField 并为此文本字段添加一个 InputAccessory。然而,这不是我想要做的。我想在我的 SwiftUI 视图中有一个全局 inputAccessoryView 并将我的自定义输入视图添加为子视图,以便它始终可见,而不是添加到我的 TextField 中。
解决方案
对于您想要的行为,我看到了两种可能的解决方案。
- 在某些情况下,SwiftUI 视图会自动移出键盘
- 在 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")
}
}
推荐阅读
- robotframework - 如何从机器人框架代码之间的全局变量中获取值
- c++ - OpenCV EqualizeHist() 从彩色图像创建黑白图像
- javascript - 使用 DOM 结合 For 循环创建表;用数组填充表?- JavaScript
- c - Makefile 编译所有 .c 文件而不需要指定它们
- javascript - ReactJS fetch 导致无限循环
- algorithm - 我对红色和黑色树的左旋转算法有疑问
- javascript - 如何建立一个新的结构以便基于价值进行分组
- java - Android - Firebase 访问级别
- strapi - Strapi - 无法“添加内容类型”
- java - 按位操作数的初学者解释