【问题标题】:swiftui ios15 keyboard avoidance issue on custom textfield自定义文本字段上的 swiftui ios15 键盘回避问题
【发布时间】:2022-12-15 14:13:53
【问题描述】:
重新发布这个Adjust View up with Keyboard show in SwiftUI 3.0 iOS15 的问题。
SwiftUI 键盘回避不会显示包括叠加层在内的整个文本字段。
我已经尝试了很多与谷歌搜索不同的方法。
有人对此有任何解决方案吗?
struct ContentView: View {
@State var text: String = ""
var body: some View {
ScrollView {
VStack {
Spacer(minLength: 600)
TextField("Placeholder", text: $text)
.textFieldStyle(CustomTextFieldStyle())
}
}
}
}
struct CustomTextFieldStyle: TextFieldStyle {
func _body(configuration: TextField<Self._Label>) -> some View {
configuration
.padding(10)
.overlay(
RoundedRectangle(cornerRadius: 20)
.stroke(Color.red, lineWidth: 5)
)
}
}
【问题讨论】:
标签:
swiftui
keyboard
overlay
textfield
ios15
【解决方案1】:
您可以编写自定义 UITextFeild,其中 intrinsicContentSize 将被覆盖。
例子:
final class _UITextField: UITextField {
override var intrinsicContentSize: CGSize {
CGSize(width: UIView.noIntrinsicMetric, height: 56)
}
}
然后,您可以使用 UIViewRepresentable 协议和 UITextFieldDelegate 编写自己的 TextField 实现:
struct _TextField: UIViewRepresentable {
private let title: String?
@Binding var text: String
let textField = _UITextField()
init(
_ title: String?,
text: Binding<String>
) {
self.title = title
self._text = text
}
func makeCoordinator() -> _TextFieldCoordinator {
_TextFieldCoordinator(self)
}
func makeUIView(context: Context) -> _UITextField {
textField.placeholder = title
textField.delegate = context.coordinator
return textField
}
func updateUIView(_ uiView: _UITextField, context: Context) {}
}
final class _TextFieldCoordinator: NSObject, UITextFieldDelegate {
private let control: _TextField
init(_ control: _TextField) {
self.control = control
super.init()
control.textField.addTarget(self, action: #selector(textFieldEditingChanged), for: .editingChanged)
}
@objc private func textFieldEditingChanged(_ textField: UITextField) {
control.text = textField.text ?? ""
}
}