Move View with Keyboard Using Swift: Optimización y rendimiento
\n\nCada desarrollador de iOS se ha enfrentado al menos una vez a la situación en la que el teclado cubre descaradamente un UITextField o UITextView. El usuario toca el campo, el teclado aparece y la interfaz permanece impasible. El resultado: frustración, errores de entrada y desinstalación de la aplicación. Resolver este problema en Swift no es solo «move view with keyboard», sino toda una ciencia sobre el rendimiento y la experiencia del usuario.
En este artículo, analizaremos cómo implementar correctamente move view with keyboard using Swift, optimizar las animaciones y evitar errores típicos. Obtendrá código listo para insertar directamente en su proyecto y comprenderá por qué algunos enfoques ralentizan la UI mientras que otros funcionan perfectamente.
\n\n¿Por qué las soluciones estándar suelen funcionar mal?
\n\nEn Stack Overflow, la pregunta «Move view with keyboard using Swift» ha acumulado miles de visitas. Y no es casualidad. Muchos principiantes copian la primera solución que encuentran de 2015, que usa UIKeyboardWillShowNotification y modifica rígidamente el frame de UIView. Resultado: animación entrecortada, fugas de memoria y errores en diferentes modelos de iPhone.
Los principales problemas de los enfoques antiguos:
\n- \n
- Modificación directa del
framesin considerar elsafe area; \n - Ignorar la duración y las curvas de animación del teclado; \n
- Falta de manejo de rotación de pantalla y multitarea; \n
- Descuido: las notificaciones no se eliminan, los objetos no se limpian. \n
El Swift moderno (5.0+) y UIKit permiten hacerlo todo de manera elegante y rápida. Analicemos el patrón óptimo.
\n\nPreparación: qué necesitaremos
\n\nPara implementar move view with keyboard using Swift utilizaremos:
\n- \n
NotificationCenterpara rastrear eventos del teclado; \n UIView.animatecon parámetros de la notificación; \n UIScrollViewcomo contenedor base (aunque también se puede prescindir de él); \n - Gestión adecuada de memoria (weak self, removeObserver). \n
Todo el código lo escribiremos en UIViewController. Si usa SwiftUI, los principios son los mismos, pero la API es diferente (más sobre esto al final del artículo).
Paso 1: Registrar las notificaciones del teclado
\n\nLo primero que hay que hacer es suscribirse a dos notificaciones clave: UIResponder.keyboardWillShowNotification y UIResponder.keyboardWillHideNotification. Son ellas las que nos proporcionan el tamaño, la duración y la curva de animación.
override func viewDidLoad() {\n super.viewDidLoad()\n \n NotificationCenter.default.addObserver(\n self,\n selector: #selector(keyboardWillShow),\n name: UIResponder.keyboardWillShowNotification,\n object: nil\n )\n \n NotificationCenter.default.addObserver(\n self,\n selector: #selector(keyboardWillHide),\n name: UIResponder.keyboardWillHideNotification,\n object: nil\n )\n}\n\n\nObserve: object: nil significa que escuchamos notificaciones de cualquier teclado. Esto es correcto para la mayoría de los casos.
Paso 2: Manejador keyboardWillShow
\n\nEn este método, extraemos de la notificación el tamaño del teclado y la duración de la animación. Luego, movemos la vista hacia arriba la altura del teclado.
\n\n@objc private func keyboardWillShow(_ notification: Notification) {\n guard let userInfo = notification.userInfo,\n let keyboardFrame = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect,\n let duration = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double,\n let curve = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? UInt else {\n return\n }\n \n let keyboardHeight = keyboardFrame.height\n let animation