swift - 如何使 TextField 始终位于键盘正上方?
问题描述
我想让 TextField 在单击时始终位于键盘的正上方。该代码无法按我的预期工作,并且 TextField 取决于其位置,而不是键盘的位置(仅当 TextField 位于键盘下方时才有效)
HStack(spacing: 10) {
TextField()
}
.onAppear {
NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillShowNotification, object: nil, queue: .main) { (noti) in
let value = noti.userInfo![UIResponder.keyboardFrameEndUserInfoKey] as! CGRect
self.height = value.height
self.clickedOut = false
}
NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillHideNotification, object: nil, queue: .main) { (noti) in
self.height = 0
self.showTextField = false
}
}
if self.showTextField == true {
TextField()
.background(Color("InvertPrimaryFontColor"))
.offset(y: (-self.height/2) - 12)
.padding(.leading, -10)
.animation(.spring())
}
解决方案
您可以使用onEditingChanged
TextField 来解决问题:
struct ContentView: View {
var body: some View {
TextFieldView()
}
}
struct TextFieldView: View {
@State private var email: String = String()
@State private var textFieldIsUnderEdit: Bool = Bool()
var body: some View {
VStack {
if textFieldIsUnderEdit { Spacer() }
TextField("Enter your email address Here...", text: $email, onEditingChanged: { _ in textFieldIsUnderEdit.toggle() })
.keyboardType(.emailAddress)
Divider()
}
.padding(.horizontal)
.animation(nil)
}
}