【问题标题】: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 ?? ""
    }
}

【讨论】:

    猜你喜欢
    • 2016-11-11
    • 2014-11-19
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 2021-03-26
    • 2023-02-06
    相关资源
    最近更新 更多