Tengo una aplicación que tiene un campo de texto en la mitad inferior de la vista. Esto significa que cuando voy a escribir en el campo de texto, el teclado cubre el campo de texto.
¿Cómo haría para mover la vista hacia arriba mientras escribo para poder ver lo que estoy escribiendo y luego volver a bajarlo a su lugar original cuando el teclado desaparece?
He buscado en todas partes, pero todas las soluciones parecen estar en Obj-C, que todavía no puedo convertir.
Cualquier ayuda sería muy apreciada.
ios
swift
uikit
nsnotificationcenter
uikeyboard
Alex Catchpole
fuente
fuente
it is actually needed to scroll view up when keyboard appears
Respuestas:
Aquí hay una solución, sin manejar el cambio de un campo de texto a otro:
Para resolver esto, reemplace las dos funciones
keyboardWillShow/Hide
con estas:EDITAR PARA SWIFT 3.0:
EDITAR PARA SWIFT 4.0:
EDITAR PARA SWIFT 4.2:
fuente
UIKeyboardFrameEndUserInfoKey
lugar deUIKeyboardFrameBeginUserInfoKey
obtener el tamaño del teclado. No estoy seguro de por qué en este momento, pero el primero arrojará resultados más consistentes.UIKeyboardFrameBeginUserInfoKey
conUIKeyboardFrameEndUserInfoKey
. El primero da el cuadro inicial del teclado, que a veces viene cero, mientras que el segundo da el cuadro final del teclado.La forma más fácil que ni siquiera requiere ningún código:
El objeto se moverá automáticamente hacia arriba con el teclado, en sincronización.
fuente
DispatchQueue.main.async {}
para arreglarlo. ¡Buen trabajo! ¡Pulgares hacia arriba!Una de las respuestas populares en este hilo usa el siguiente código:
Hay un problema obvio al compensar su vista por una cantidad estática. Se verá bien en un dispositivo pero se verá mal en cualquier configuración de otro tamaño. Deberá obtener la altura del teclado y usarlo como su valor de desplazamiento.
Aquí hay una solución que funciona en todos los dispositivos y maneja el caso extremo donde el usuario oculta el campo de texto predictivo mientras escribe.
Solución
Es importante tener en cuenta a continuación, estamos pasando self.view.window como nuestro parámetro de objeto. Esto nos proporcionará datos de nuestro teclado, como su altura.
Haremos que se vea bien en todos los dispositivos y manejaremos el caso en el que el usuario agrega o elimina el campo de texto predictivo.
Eliminar observadores
No olvide eliminar a sus observadores antes de abandonar la vista para evitar que se transmitan mensajes innecesarios.
Actualización basada en la pregunta de los comentarios:
Si tiene dos o más campos de texto, puede verificar si su view.frame.origin.y está en cero.
fuente
Agregue esto a su controlador de vista. Funciona de maravilla. Solo ajusta los valores.
fuente
Mejoré un poco una de las respuestas para que funcione con diferentes teclados y diferentes vistas / campos de texto en una página:
Añadir observadores:
Eliminar observadores:
fuente
No es un anuncio o promoción o spam , solo una buena solución. Sé que esta pregunta tiene casi 30 respuestas y estoy tan sorprendido que nadie mencionó ni una sola vez sobre este hermoso proyecto de GitHub que lo hace todo por ti y aún mejor. Todas las respuestas solo mueven la vista hacia arriba. Acabo de resolver todos mis problemas con este IQKeyboardManager. Tiene más de 13000 estrellas.
Simplemente agregue esto en su podfile si está utilizando swift
y luego dentro de su AppDelegate.swift do
import IQKeyboardManagerSwift
Agregue la línea
IQKeyboardManager.shared.enable = true
para habilitarla.Esta solución es imprescindible si va a la producción.
fuente
import IQKeyboardManager
y lo usoIQKeyboardManager.shared().isEnabled = true
en AppDelegatePara error de pantalla negra (Swift 4 y 4.2) .
Solucioné el problema de la pantalla en negro. En la solución verificada La altura del teclado cambia después de tocar y esto está causando una pantalla negra.
Tiene que usar UIKeyboardFrameEndUserInfoKey en lugar de UIKeyboardFrameBeginUserInfoKey
fuente
Veo que todas las respuestas están moviendo la vista en sí por el valor de la altura del teclado. Bueno, tengo una respuesta elaborada, que podría ser útil si está utilizando restricciones
autolayout
, es decir , que mueve una vista cambiando su valor de restricción (restricciones inferiores o superiores, por ejemplo) por un valor predefinido o puede usar el valor del tamaño del teclado.En este ejemplo, uso la restricción inferior del campo de texto a la Vista de diseño inferior con un valor inicial de 175.
fuente
Ha habido algunos cambios en la forma en que definimos KeyboardWillHideNotification.
Esta solución funciona con Swift 4.2 :
fuente
Después de 4-5 horas de pelea, llegué con una extensión simple de UIViewController con un código simple que funciona como encanto
* La vista no debe moverse cuando TextField está sobre el teclado
* No es necesario establecer un valor constante en NSLayoutConstraint
* No se requiere biblioteca de terceros
* No se requiere código de animación
* Funciona en tableview también
* Esto funciona en diseño automático / cambio de tamaño automático
Agregue esta extensión de UIResponder para obtener qué TextField está seleccionado
Luego use esto en cualquier ViewController
Registre esta notificación en
func viewWillAppear(_ animated: Bool)
Anular el registro de esta notificación en
func viewWillDisappear(_ animated:Bool)
Descargue la demostración aquí
fuente
Para Swift 3, hice una subclase UIViewController ya que necesitaba un comportamiento constante en todos los controladores de vista.
fuente
La respuesta validada no tiene en cuenta la posición del campo de texto y tiene algún error (desplazamiento doble, nunca vuelve a la posición primaria, desplazamiento incluso si el campo de texto está en la parte superior de la vista ...)
La idea es:
entonces podremos mover la vista solo si es necesario y del desplazamiento específico para tener el texField enfocado justo sobre el teclado
Aquí está el código:
Swift 4
}
fuente
Noté que las otras respuestas involucraban cortar algo de la parte superior de la vista. Si simplemente desea cambiar el tamaño de la vista sin cortar ningún contenido, simplemente pruebe este método :)
fuente
Mis dos centavos para principiantes: en las muestras anteriores, alguien cambia las coordenadas, otro usa la "máscara de autoresizing" y otras restricciones:
Como dice Apple, no mezcle estos 3 tipos de lógica. Si tiene restricciones en Storyboard, no intente cambiar x / y. Definitivamente no funciona.
fuente
Entonces, ninguna de las otras respuestas parece acertar.
El teclado Good Behaviored en iOS debería:
Mi código usa un
NSLayoutConstraint
declarado como un@IBOutlet
También podría usar transformaciones, ver compensaciones, ... Creo que es más fácil con la restricción aunque. Funciona al establecer una restricción en la parte inferior, es posible que deba modificar el código si su constante no es 0 / No en la parte inferior.
Aquí está el código:
fuente
su respuesta 100% perfecta para la altura de Tableview de actualización de todos cuando se abre el teclado
Para Swift4.2
Swift3.2
fuente
Para Swift 3
fuente
Swift 4:
Estaba teniendo un problema con la respuesta más aceptada, en la que ocultar el teclado no devolvía la vista hasta el final de la página (solo parcialmente). Esto funcionó para mí (+ actualizado para Swift 4).
fuente
Similar a la respuesta de @Boris, pero en Swift 5 :
fuente
Aquí está mi solución (en realidad, este código es para el caso cuando tiene pocos campos de texto en su vista, esto también funciona para el caso cuando tiene un campo de texto)
fuente
Actualizado para Swift 3 ...
Como han dicho otros, debe agregar observadores de notificación en el método viewDidLoad () de su controlador, de esta manera:
Recuerde eliminar a sus observadores cuando corresponda (lo hago en el método viewWillDisappear ())
Luego, implemente sus métodos de mostrar y ocultar: observe la línea que le dice a la aplicación que ignore los eventos de interacción (beginIgnoringInteractionEvents). Esto es importante ya que sin él, el usuario podría tocar un campo o incluso una vista de desplazamiento y hacer que el cambio ocurra por segunda vez, lo que da como resultado un terrible error de la interfaz de usuario. Ignorar los eventos de interacción antes de que el teclado se muestre y se oculte evitará esto:
Por último, vuelva a habilitar las interacciones del usuario (recuerde, este método se activa después de que el teclado hizo Mostrar o Esconder):
fuente
Código Swift 3
fuente
Si tiene 2 o más campos de texto en el mismo VC, y el usuario toca uno de ellos y luego toca el otro, sin llamar a la función keyboardWillHide, la vista va hacia arriba una vez más, lo cual no es necesario, porque tendrás el teclado, un espacio en blanco que tiene la altura del teclado, y luego la vista, usando el código en la respuesta que edité:
Para resolver esto, reemplace las dos funciones "KeyboardWillShow / Hide" por estas:
fuente
La solución de @ Boris es MUY buena, pero la vista a veces puede corromperse.
Para la alineación perfecta, use el siguiente código
Funciones:
Y,
fuente
Este video tutorial es el mejor. 7 minutos de duración y tendrá mucho sentido. Una solución tan simple para cuando tiene múltiples campos de texto y desea que la vista de desplazamiento mueva la cantidad "x" de píxeles cuando se toca ese campo de texto específico.
https://youtu.be/VuiPGJOEBH4
Solo estos pasos:
-Coloque todos sus campos de texto dentro de una vista de desplazamiento que esté restringida a los bordes de la vista.
-Conecte todos los campos de texto y vista de desplazamiento como delegados al controlador de vista.
-Conecte todos los campos de texto y vista de desplazamiento con un IBOutlet.
-Agregue el protocolo UITextFieldDelegate a su clase
-Agregue métodos UITextFieldDelegate a su archivo swift:
El primer método simplemente activa el botón de retorno en el teclado para descartar el teclado. El segundo es cuando toca cualquier campo de texto específico y luego establece el desplazamiento y de qué tan lejos se desplaza su vista de desplazamiento (la mía se basa en la ubicación y en mis controladores de vista 25,57,112,142). La última dice que cuando toca el teclado, la vista de desplazamiento vuelve a su ubicación original.
¡Hice mi píxel de vista perfecto de esta manera!
fuente
Esta característica shud se ha incorporado en iOS, sin embargo, debemos hacerlo externamente.
Inserte el código a continuación
* Para mover la vista cuando textField está debajo del teclado,
* No mover la vista cuando textField está arriba del teclado
* Para mover la vista según la altura del teclado cuando sea necesario.
Esto funciona y probado en todos los casos.
| :: | A veces la vista estará abajo, en ese caso use la altura +/- 150:
fuente
debe ser más estable
fuente
fuente
Utilice el siguiente código para ver Up en UITextField Clicked
fuente
Hice un cocoapod para simplificar el asunto:
https://github.com/xtrinch/KeyboardLayoutHelper
Cómo usarlo:
Haga una restricción inferior de diseño automático, asígnele una clase de KeyboardLayoutConstraint en el módulo KeyboardLayoutHelper y el pod hará el trabajo necesario para aumentarlo para acomodar el teclado que aparece y desaparece. Vea el proyecto de ejemplo sobre ejemplos de cómo usarlo (hice dos: campos de texto dentro de una vista de desplazamiento y campos de texto centrados verticalmente con dos vistas básicas: inicio de sesión y registro).
La restricción de diseño inferior puede ser la vista de contenedor, el campo de texto en sí, cualquier cosa, lo que sea.
fuente