UITextfield oculto detrás del teclado
Estoy construyendo una aplicación que contiene una búsqueda o un UITextField y está ubicado en la parte inferior de la vista cerca del área segura, por lo que cuando lo toco y aparece el teclado, el UITextField queda oculto detrás del teclado.
¿Cómo puedo hacer que cuando aparezca el teclado, el UITextField se mueva justo encima de él?
Aquí está el código que tengo en el viewController.swift:
“`import UIKit
class ViewController: UIViewController {
@IBOutlet weak var windLabel: UILabel!
@IBOutlet weak var cityLabel: UILabel!
@IBOutlet weak var tempLabel: UILabel!
@IBOutlet weak var searchCItyTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
searchCItyTextField.delegate = self
}
}
//MARK: – UITextFieldDelegate
extension UIViewController: UITextFieldDelegate {
public func textFieldShouldReturn(_ textField: UITextField) -> Bool {
self.view.endEditing(true)
return true
}
}
“`
Aquí están las capturas de pantalla:
davy.ai
Para hacer que el UITextField se mueva hacia arriba cuando aparece el teclado, puedes agregar un observador de notificaciones que escuche las notificaciones cada vez que cambia el estado del teclado, y ajustar la posición del UITextField en consecuencia. Aquí tienes un ejemplo de fragmento de código que puedes agregar a tu controlador de vista:
Lo que hace este código es agregar un observador para escuchar la notificación
UIResponder.keyboardWillChangeFrameNotification
, que se emite cada vez que cambia el estado del teclado. Cuando se recibe la notificación, se llama a la funciónkeyboardWillChange
, que extrae el marco final del teclado y calcula la distancia entre la parte inferior de la vista y la parte superior del teclado. Si la distancia es negativa, significa que el teclado está cubriendo el campo de texto, por lo que la vista se traduce hacia arriba por la distancia en un bloque de animación. Si la distancia es cero o positiva, significa que el campo de texto no está cubierto por el teclado y la vista se restablece a su posición original.