Aunque he buscado, estoy confundido acerca de cuál es la mejor manera de abordar esto.
Tengo un tableView donde la celda inferior es una entrada a la lista, de la misma manera que funcionan los recordatorios de Apple. Cuando hay demasiados elementos en la lista, el teclado cubre la lista y no puedo ver lo que estoy escribiendo.
Pensé que necesitaba cambiar el tamaño físico de la vista de la tabla y asegurarme de que se desplaza hacia abajo cuando se muestra el teclado.
Algunos han dicho observadores del teclado, pero la mayoría del código que he encontrado para esto está desactualizado y tiene errores cuando se coloca en Xcode.
NSNotificationCenter Swift 3.0 en el teclado mostrar y ocultar
Esto es lo mejor que puedo encontrar, pero también escucho sobre restricciones, usando un UITableViewController en lugar de incrustar un UITableView, etc.
Este es el código que tengo hasta ahora:
NotificationCenter.default.addObserver(self, selector: #selector(EntryViewController.keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(EntryViewController.keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil) @objc func keyboardWillShow(notification: Notification) { if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue { print("notification: Keyboard will show") if self.view.frame.origin.y == 0{ self.view.frame.origin.y -= keyboardSize.height } } } @objc func keyboardWillHide(notification: Notification) { if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue { if self.view.frame.origin.y != 0 { self.view.frame.origin.y += keyboardSize.height } } }Creo que esto mueve toda la vista hacia arriba, lo que significa que las áreas seguras (como la barra de navegación, etc.) tienen TableView debajo de ellas. ¿Hago que la vista de navegación no sea transparente en este enfoque?
Una solución (que a veces uso) es simplemente cambiar el desplazamiento del contenido de tableView cuando aparece/desaparece el teclado. Creo que esto funcionaría en su instancia en lugar de variar las restricciones de tableView como mencionó que su UIViewController es un UITableViewController . Consulte el siguiente código para ver mi sugerencia, ¡espero que esto ayude!
Manejar notificaciones:
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) NotificationCenter.default.addObserver(self, selector: #selector(EntryViewController.keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(EntryViewController.keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil) } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) NotificationCenter.default.removeObserver(self) }Comportamiento:
@objc func keyboardWillShow(notification: Notification) { if let keyboardHeight = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.height { print("Notification: Keyboard will show") tableView.setBottomInset(to: keyboardHeight) } } @objc func keyboardWillHide(notification: Notification) { print("Notification: Keyboard will hide") tableView.setBottomInset(to: 0.0) }Extensiones:
extension UITableView { func setBottomInset(to value: CGFloat) { let edgeInset = UIEdgeInsets(top: 0, left: 0, bottom: value, right: 0) self.contentInset = edgeInset self.scrollIndicatorInsets = edgeInset } }