#ios #swift #xcode #swiftui
#iOS #swift #xcode #swiftui
Вопрос:
Я пытаюсь создать SwiftUI Textfield
, который должен быть интерактивным во всей серой области для ввода текста (чтобы лучше его визуализировать, я сделал красную рамку).
Слово «Поиск» в качестве заполнителя должно быть центрировано внутри этого поля, чтобы оно выглядело лучше.
У меня проблема в том, что во всей области под и над словом «Поиск» поле недоступно для просмотра.
struct ContentView: View {
@State private var searchText = ""
var body: some View {
HStack {
Image(systemName: "magnifyingglass")
Spacer()
TextField("Search", text: self.$searchText).foregroundColor(.primary)
.frame(height: 40).border(Color.red) //This line is just to show what I want to achive to be clickable.
Spacer()
}
.foregroundColor(.secondary)
.background(Color(.secondarySystemBackground))
.cornerRadius(10.0)
}
}
Комментарии:
1. К сожалению, вы не можете этого сделать. Однако я посмотрю, смогу ли я придумать обходной путь, если я это сделаю, я вернусь к вам 🙂
Ответ №1:
На данный момент это невозможно, но вы можете реализовать что-то подобное самостоятельно.
Вы можете создать пользовательское текстовое поле и добавить значение, чтобы оно становилось первым ответчиком всякий раз, когда пользователь нажимает на область, окружающую ваше текстовое поле.
Итак, прежде всего, что мы собираемся сделать, это создать UIViewRepresentable
, чтобы сделать наш пользовательский TextField
struct CustomTextField: UIViewRepresentable {
class Coordinator: NSObject, UITextFieldDelegate {
@Binding var text: String
var didBecomeFirstResponder = false
init(text: Binding<String>) {
_text = text
}
func textFieldDidChangeSelection(_ textField: UITextField) {
text = textField.text ?? ""
}
}
@Binding var text: String
var isFirstResponder: Bool = false
func makeUIView(context: UIViewRepresentableContext<CustomTextField>) -> UITextField {
let textField = UITextField(frame: .zero)
textField.delegate = context.coordinator
return textField
}
func makeCoordinator() -> CustomTextField.Coordinator {
return Coordinator(text: $text)
}
func updateUIView(_ uiView: UITextField, context: UIViewRepresentableContext<CustomTextField>) {
uiView.text = text
if isFirstResponder amp;amp; !context.coordinator.didBecomeFirstResponder {
uiView.becomeFirstResponder()
context.coordinator.didBecomeFirstResponder = true
}
}
}
Теперь все, что нам нужно сделать, это реализовать наш CustomTextField
, как показано ниже:
struct ContentView: View {
@State private var searchText = ""
@State private var clickableTextField = false
var body: some View {
HStack {
Image(systemName: "magnifyingglass")
Spacer()
CustomTextField(text: $searchText, isFirstResponder: clickableTextField)
.foregroundColor(.primary)
.frame(height: 40).border(Color.red)
.border(Color.red)
Spacer()
}
.foregroundColor(.secondary)
.background(Color(.secondarySystemBackground))
.cornerRadius(10.0)
.onTapGesture {
self.clickableTextField = true
}
}
}
Вуаля! теперь ваш TextField
сайт доступен для кликабельности, как вы и просили.