TextField我的主箱里有七个ContentView。当用户打开键盘时,其中一些TextField隐藏在键盘框架下。所以TextField当键盘出现时,我想分别向上移动。
我已使用以下代码TextField在屏幕上添加。
struct ContentView : View {
@State var textfieldText: String = ""
var body: some View {
VStack {
TextField($textfieldText, placeholder: Text("TextField1"))
TextField($textfieldText, placeholder: Text("TextField2"))
TextField($textfieldText, placeholder: Text("TextField3"))
TextField($textfieldText, placeholder: Text("TextField4"))
TextField($textfieldText, placeholder: Text("TextField5"))
TextField($textfieldText, placeholder: Text("TextField6"))
TextField($textfieldText, placeholder: Text("TextField6"))
TextField($textfieldText, placeholder: Text("TextField7"))
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
在文本字段内单击时如何选择所有文本?就像在 Chrome 等网络浏览器中单击地址栏时的情况一样。
import SwiftUI
import AppKit
struct ContentView: View {
var body: some View {
TextField("Enter a URL", text: $site)
}
}
Run Code Online (Sandbox Code Playgroud) 我像这样设置了 ScrollView:
ScrollView(.vertical) {
// ...
}
.scrollDismissesKeyboard(.interactively)
.safeAreaInset(edge: .bottom, spacing: 0) {
TextInputCellView(with: Color(hex: 0xf5f9fc)) { value in
vm.send(text: value)
}
}
Run Code Online (Sandbox Code Playgroud)
然而,新添加的scrollDissmissesKeyboard作品看起来和感觉起来确实有点奇怪。这是一个错误还是我做错了什么?
我想要一个像 iMessage 中那样的输入附件视图。该栏始终在屏幕底部可见。当 TextField 获得焦点时,键盘会跳入,并且栏会自动向上移动,同时停留在键盘顶部。
在 UIKit 中,ViewController 可以覆盖 inputAccessory 并成为第一个响应者。因此输入附件永久可见。我找不到在 SwiftUI 中执行此操作的方法。
当键盘弹出时,保存消息并填充屏幕的滚动视图必须相应缩小。向下拖动滚动视图和交互移动键盘时也是如此。拖动时必须调整视图的大小。
最重要的要求是,在拖动滚动视图(以交互方式向下移动键盘)时,这必须顺利工作。iMessage 或 WhatsApp 中的行为相同。输入附件必须在拖动时移动,并且滚动视图也必须调整大小。键盘关闭后,工具栏/输入附件必须在底部保持可见。
我阅读了InputAccessoryView / View Pinned to Keyboard with SwiftUI,但这与我的问题不相似。我需要工具栏可见,即使键盘未显示。此外,该问题中接受的答案在 iOS 15 中无法正常工作。拖动以关闭键盘会留下白色间隙。
在 UIKit 实现中,持有视图是一个带有键盘关闭交互集的 UITableViewController。这意味着,当显示键盘时,您可以拖动视图,并同时向下拖动键盘和附件视图,直到键盘消失。不过,附件视图仍然保留在底部。
在 UIKit 中的实现非常简单,如下所示。一切都是开箱即用的。
class ChatTableViewController: UITableViewController {
...
override var inputAccessoryView: UIView? {
return inputBar
}
override var canBecomeFirstResponder: Bool {
return true
}
...
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试在 SwiftUI 中的 TextField 上实现 inputAccessoryView。目标是在键盘上方出现一个“完成”按钮,按下该按钮后即可摆脱键盘(即 resignFirstResponder())。
我遇到了以下 Medium 文章,该文章声称完全按照我的要求实施此行为,但是,我正在努力使其正常工作。
我试图在一个空白的 XCode 项目中实现这个,我的代码编译,但是,TextField 永远不会出现,我无法触摸应该调出键盘的区域。如何正确实现此代码以获得所需的行为?
import Foundation
import UIKit
import SwiftUI
class TextFieldViewController
: UIViewController {
// our custom text field will report changes to the outside
let text: Binding<String>?
// if the toolbar (see below) is used (Done), the keyboard shall be dismissed
// and optionally we execute a provided closure
let onDismiss: (() -> Void)?
init (
text: Binding<String>
, onDismiss: (() -> Void)?) {
self.text = …Run Code Online (Sandbox Code Playgroud)