Estoy usando Swift para programar con iOS y estoy usando este código para mover el UITextField
, pero no funciona. Llamo a la función keyboardWillShow
correctamente, pero el campo de texto no se mueve. Estoy usando autolayout.
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil);
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil);
}
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self);
}
func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
//let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height, right: 0)
var frame = self.ChatField.frame
frame.origin.y = frame.origin.y - keyboardSize.height + 167
self.chatField.frame = frame
println("asdasd")
}
}
ios
swift
cocoa-touch
keyboard
uitextfield
Pedro Manfredi
fuente
fuente
Respuestas:
Hay un par de mejoras por hacer en las respuestas existentes.
En primer lugar, UIKeyboardWillChangeFrameNotification es probablemente la mejor notificación, ya que maneja los cambios que no solo se muestran / ocultan, sino también los cambios debidos a cambios en el teclado (idioma, uso de teclados de terceros, etc.) y rotaciones también (pero tenga en cuenta el comentario a continuación que indica que el teclado se ocultará) También se debe manejar para admitir la conexión del teclado de hardware).
En segundo lugar, los parámetros de animación se pueden extraer de la notificación para garantizar que las animaciones se unan correctamente.
Probablemente hay opciones para limpiar este código un poco más, especialmente si se siente cómodo con el desenvolvimiento forzado del código del diccionario.
Swift 3
(Editado para tener en cuenta la animación del teclado fuera de la pantalla en lugar de reducirse, según el impresionante comentario de @ Gabox a continuación)
Swift 5
fuente
endFrame?.size.height
no es nulo. Obtuve el marco final comoUIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 1024}, {768, 264}}";
. Se ejecutó en iOS 8.3 iPad Simulator, Portrait. Xcode6.3 beta4..UIKeyboardWillChangeFrame
no se activa cuando se conecta un teclado de hardware, aunque el teclado iOS desaparezca. También debe observar.UIKeyboardWillHide
para captar ese caso límite.Si está utilizando el diseño automático, supongo que ha establecido el espacio inferior en la restricción de Supervisión . Si ese es el caso, simplemente tiene que actualizar el valor de la restricción. Así es como lo haces con un poco de animación.
El 20 codificado se agrega solo para resaltar el campo de texto sobre el teclado solo un poco. De lo contrario, el margen superior del teclado y el margen inferior del campo de texto se tocarían.
Cuando se descarta el teclado, restablezca el valor de la restricción a su valor original.
fuente
UIKeyboardWillShowNotification
notificaciones. Mire el código en la pregunta del OP.animateWithDuration
y llameself.view.layoutIfNeeded()
dentro del bloque animado.Una solución simple es mover la vista hacia arriba con una altura constante del teclado.
Swift 5:
fuente
self.view.frame.origin.y -= 150
usoself.view.frame.origin.y = -150
y en lugar deself.view.frame.origin.y += 150
usarself.view.frame.origin.y = 0
. Esto evita que la vista se mueva 150 cada vez que se toca un nuevo campo.Para mover su vista mientras edita el campo de texto intente esto, he aplicado esto,
Opción 1: - ** ** Actualización en Swift 5.0 y iPhone X, XR, XS y XS Max Move usando NotificationCenter
Registre esta notificación en
func viewWillAppear(_ animated: Bool)
Anular el registro de esta notificación en
func viewWillDisappear(_ animated: Bool)
Nota: - Si no cancelará el registro, llamará desde la clase secundaria y provocará un bloqueo u otra cosa.
Opción 2: - Funciona bien
Recibí esta respuesta de esta fuente UITextField subir cuando el teclado aparece en Swift
EN el Swift 4 ---
fuente
Me encanta el código Swift limpio. Así que aquí está el código más estricto que se me ocurrió para mover una vista de texto hacia arriba / abajo con el teclado. Actualmente está trabajando en una aplicación de producción iOS8 / 9 Swift 2.
ACTUALIZACIÓN (marzo de 2016): acabo de ajustar mi código anterior tanto como sea posible. Además, hay un montón de respuestas populares aquí que codifican la altura del teclado y los parámetros de animación. No hay necesidad de eso, sin mencionar que los números en estas respuestas no siempre se alinean con los valores reales que veo en mi 6s + iOS9 (altura del teclado de 226, duración de 0.25 y curva de animación de 7). En cualquier caso, casi no es un código adicional para obtener esos valores directamente del sistema. Vea abajo.
NOTA: Este código cubre la mayoría de los comentarios / caso general. Sin embargo, es posible que se necesite más código para manejar diferentes orientaciones y / o teclados personalizados. Aquí hay un artículo detallado sobre cómo trabajar con el teclado iOS. Si necesita manejar cada escenario, esto puede ayudar.
fuente
as
para lanzamientos de fuerza.as!
puede funcionar, pero como puede ver en otra parte de esta página, evito los lanzamientos forzados y el desenvolvimiento forzado.baseConstraint
, podría ser enbaseConstraint.constant = moveUp ? keyboardHeight : 0
lugar debaseConstraint.constant = moveUp ? -keyboardHeight : 0
.Editar : recomiendo una solución más fácil y limpia. Simplemente cambie la clase de restricción de espacio inferior a KeyboardLayoutConstraint . Se expandirá automáticamente a la altura del teclado.
Esta es una versión mejorada de la respuesta de @JosephLord.
Según lo probado en iOS 8.3 iPad Simulator, Portrait. Xcode6.3 beta4, que encontró su respuesta no funciona cuando el teclado se esconde porque
UIKeyboardFrameEndUserInfoKey
es"NSRect: {{0, 1024}, {768, 264}}";
. La altura nunca es0
.Esto vuelve a usar el tradicional
UIKeyboardWillShowNotification
yUIKeyboardWillHideNotification
para saber mejor cuándo se oculta el teclado en lugar de confiar en la altura del marco final.UIKeyboardWillShowNotification
también se envía cuando se cambia el marco del teclado, por lo que debe cubrir todos los casos de uso.fuente
estoy trabajando con swift 4 y he resuelto este problema sin usar ninguna restricción inferior adicional, mi código está aquí. Realmente funciona en mi caso
1) Agregue el Observador de notificaciones en carga
2) Eliminar el Observador de notificaciones como
3) Agregue métodos de mostrar / ocultar teclado como
4) Agregue delegado de textfeild y agregue toques Métodos comenzados .usefull para ocultar el teclado cuando toque fuera del textfeild en la pantalla
fuente
UIKeyboardFrameEndUserInfoKey
NSNotification.Name.UIKeyboardWillShow
se renombra aUIResponder.keyboardWillShowNotification
tambiénUIKeyboardFrameBeginUserInfoKey
paraUIResponder.keyboardFrameBeginUserInfoKey
Esta es una versión mejorada de @JosephLord y la respuesta de @ Hlung. Se puede aplicar si tienes tabbar o no. Y restauraría perfectamente la vista que el teclado mueve a su posición original.
fuente
La forma más fácil que no requiere ningún código:
El objeto se moverá automáticamente hacia arriba con el teclado, en sincronización.
fuente
Creé un protocolo Swift 3 para manejar la apariencia / desaparición del teclado
Luego, para implementarlo en un UIViewController, haga lo siguiente:
deje que viewController se ajuste a este protocolo:
comience a observar los cambios de teclado en viewWillAppear:
deje de observar los cambios del teclado en viewWillDisappear:
cree un IBOutlet para la restricción inferior del guión gráfico:
(Recomiendo tener toda su IU incrustada dentro de un "contentView", y vincular a esta propiedad la restricción inferior de este contentView a la guía de diseño inferior)
cambie la prioridad de restricción de la restricción superior a 250 (baja)
Esto es para permitir que toda la vista de contenido se deslice hacia arriba cuando aparece el teclado. La prioridad debe ser más baja que cualquier otra prioridad de restricción en las subvistas, incluidas las prioridades de abrazo de contenido / prioridades de resistencia a la compresión de contenido.
Puede que tenga que agregar una restricción "mayor que igual" para esto:
¡Y aquí tienes!
fuente
import UIKit
Tal
UIViewController
extensión simple puede ser utilizadaEjemplo de uso
Solución Swift 4
Swift 4.2
fuente
removeKeyboardObserver()
método aquí en realidad no elimina al observador. Si no llama a esto, verá unInvalid conditions for UIKeyboardWillChangeFrameNotification
en la consola desde el método add. Si llama a esto, verá el mismo error, lo que significa que el observador no se elimina. La documentación dice "Para cancelar el registro de observaciones, pasa el objeto devuelto por este método aremoveObserver(_:)
". Entonces, lo que debe hacer es guardar el objeto devuelto por ese método y luego pasarlo cuando desee eliminar el observador.Puede usar esta biblioteca y solo una línea de código en appDidFinishedLaunching y listo.
IQKeyboardManager: ajuste la vista siempre que aparezca el enlace del teclado: https://github.com/hackiftekhar/IQKeyboardManager
fuente
Y por último, ya que estamos utilizando métodos de delegados
refactorizado a partir del objetivo-c http://www.cocoawithlove.com/2008/10/sliding-uitextfields-around-to-avoid.html
fuente
var animateDistance: CGFloat!
plus que tenía que manejar la Notificación UIKeyboardWillHide para cuando el usuario presiona el botón Ocultar teclado.Otra solución que no depende de la distribución automática, las restricciones o cualquier salida. Lo que necesita es su campo (s) en una vista de desplazamiento.
fuente
UIKeyboardWillShowNotification
llamada.Aquí está mi versión para una solución para Swift 2.2:
Primero regístrese para mostrar / ocultar notificaciones de teclado
Luego, en los métodos correspondientes a esas notificaciones, mueva la vista principal hacia arriba o hacia abajo
El truco está en la parte "keyboardWillShow", que recibe llamadas cada vez que la "Barra de sugerencias QuickType" se expande o colapsa. Luego, siempre establecemos la coordenada y de la vista principal, que es igual al valor negativo de la altura total del teclado (con o sin la parte "Barra de tipo rápido").
Al final no olvides eliminar a los observadores
fuente
La siguiente es una solución simple, por la cual el campo de texto tiene una restricción que lo vincula a la guía de diseño inferior. Simplemente agrega la altura del teclado a la constante de la restricción.
fuente
Bueno, creo que podría ser demasiado tarde, pero encontré otra versión simple de la respuesta de Saqib. Estoy usando Autolayout con restricciones. Tengo una pequeña vista dentro de otra vista principal con campos de nombre de usuario y contraseña. En lugar de cambiar la coordenada y de la vista, estoy guardando el valor de restricción original en una variable y cambiando la constante de la restricción a algún valor y nuevamente después de que el teclado se cierra, estoy configurando la restricción a la original. De esta forma, evita el problema que tiene la respuesta de Saqib, (La vista sigue subiendo y no se detiene). Debajo está mi código ...
fuente
Respuesta rápida 4.x, combinando respuestas de @Joseph Lord y @Isuru.
bottomConstraint
representa la restricción inferior de la vista que le interesa mover.fuente
Lo he hecho de la siguiente manera:
Esto es útil cuando textview superview es view
fuente
fuente
Lo he hecho de la siguiente manera:
fuente
Si eres como yo y probé todas las soluciones anteriores y aún no se resuelve tu problema, tengo una excelente solución para ti que funciona de maravilla. Primero quiero aclarar algunas cosas sobre algunas de las soluciones mencionadas anteriormente.
fuente
Aquí hay una solución genérica para todos los pasos de TextField:
1) Cree un ViewController común que sea extendido por otros ViewControllers
2) Cree una extensión de UIViewController y el TextField actualmente activo
extensión UIViewController {func getSelectedTextField () -> UITextField? {
}
fuente
Muy simple y sin necesidad de codificar más. Simplemente agregue
pod 'IQKeyboardManagerSwift'
su podfile y en suAppDelegate
página agregue el código a continuación.y en
didFinishLaunchingWithOptions()
tipo de métodoeso es. revise este enlace de video para una mejor comprensión https://youtu.be/eOM94K1ZWN8 Espero que esto lo ayude.
fuente
Código completo para gestionar el teclado.
fuente
Modifiqué un poco la solución @Simpa .........
fuente
Ninguno de ellos funcionó y terminé usando inserciones de contenido para mover mi vista hacia arriba cuando aparece el teclado.
Nota: Estaba usando un UITableView
Solución referenciada @ keyboard-content-offset que fue escrita completamente en el objetivo C, la solución a continuación es limpia Swift.
Agregue el observador de notificaciones @ viewDidLoad ()
Para obtener el tamaño del teclado, primero obtenemos el diccionario userInfo del objeto de notificación, que almacena cualquier objeto adicional que nuestro receptor pueda usar.
De ese diccionario podemos obtener el objeto CGRect que describe el marco del teclado usando la tecla UIKeyboardFrameBeginUserInfoKey.
Aplique el contenido para el método de vista de tabla @ keyboardWillBeShown,
Restaurar el método view @ keyboardWillBeHidden
Si desea mantener la orientación del dispositivo también en consideración, use declaraciones condicionales para adaptar el código a sus necesidades.
fuente
fuente
La solución Swift 4 que uso toma el tamaño del teclado. Reemplace
serverStatusStackView
con cualquier vista que le interese, por ejemploself.view
::fuente
La mejor manera es usar NotificationCenter para capturar acciones del teclado. Puede seguir los pasos en este breve artículo https://medium.com/@demirciy/keyboard-handling-deb1a96a8207
fuente