Estoy tratando de construir una pantalla de entrada para el iPhone. La pantalla tiene varios campos de entrada. La mayoría de ellos en la parte superior de la pantalla, pero dos campos están en la parte inferior. Cuando el usuario intenta editar el texto en la parte inferior de la pantalla, aparecerá el teclado y cubrirá la pantalla. Encontré una solución simple para mover la pantalla hacia arriba cuando esto sucede, pero el resultado es que la pantalla siempre se mueve hacia arriba y los campos en la parte superior de la pantalla se alejan cuando el usuario intenta editarlos.
¿Hay alguna manera de que la pantalla solo se mueva cuando se editan los campos inferiores?
He usado este código que encontré aquí :
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)
}
func keyboardWillShow(sender: NSNotification) {
self.view.frame.origin.y -= 150
}
func keyboardWillHide(sender: NSNotification) {
self.view.frame.origin.y += 150
}
Respuestas:
Su problema está bien explicado en este documento por Apple . El código de ejemplo en esta página (at
Listing 4-1
) hace exactamente lo que necesita, desplazará su vista solo cuando la edición actual esté debajo del teclado. Solo necesita poner los controles necesarios en una vista de desplazamiento. El único problema es que este es Objective-C y creo que lo necesitas en Swift ... así que aquí está:Declarar una variable
luego agregue estos métodos
Asegúrese de declarar su ViewController como
UITextFieldDelegate
y establecer delegados correctos en sus métodos de inicialización: por ejemplo:Y recuerde llamar
registerForKeyboardNotifications
a viewInit yderegisterFromKeyboardNotifications
al salir.Editar / Actualizar: sintaxis Swift 4.2
fuente
UIKeyboardFrameEndUserInfoKey
lugar deUIKeyboardFrameBeginUserInfoKey
, porque este último devuelve la altura 0. Y cambia el punto de prueba al fondo, no el origen.if let activeField = self.activeField { var point = activeField.frame.origin point.y += activeField.frame.size.height if (!aRect.contains(point)){ self.scrollView.scrollRectToVisible(activeField.frame, animated: true) } }
textField's didBeginEditing
método se llama DESPUÉS de que se llamó alkeyboardWillShow
método. Como resultado, laactiveField
variable sigue siendo nula, lo que significa que no ocurre desplazamiento automático. Mi solución fue poner laactiveField = textField
llamada en elshouldBeginEditing
método textField . Esto resuelve el problema del orden de las llamadas.Aquí están mis 2 centavos:
¿Has probado: https://github.com/hackiftekhar/IQKeyboardManager
Extremadamente fácil de instalar Swift u Objective-C.
Aquí cómo funciona:
IQKeyboardManager (Swift): - IQKeyboardManagerSwift está disponible a través de CocoaPods, para instalarlo simplemente agregue la siguiente línea a su Podfile: (# 236)
En AppDelegate.swift, solo importe el marco IQKeyboardManagerSwift y habilite IQKeyboardManager.
Y eso es todo. ¡Fácil!
fuente
IQKeyboardManager.shared.enable = true
El que encontré que funcionaba perfectamente para mí fue este:
También puede cambiar los valores de altura. Elimine la "instrucción if" si desea usarla para todos los campos de texto.
Incluso puede usar esto para todos los controles que requieren la entrada del usuario como TextView.
fuente
Tuve un problema similar y encontré una solución bastante sencilla sin usar scrollView, y en su lugar usando if en los métodos keyboardWillShow / Hide.
Esta fue una buena solución para mí porque solo tenía dos campos de texto.
Desplaza toda la vista hacia arriba: solo cuando se editan ciertos campos de texto (bottomText)
Desplaza toda la vista hacia abajo: solo cuando la vista no está en la ubicación original
fuente
Solo use esta extensión para mover cualquier UIView cuando se presente el teclado.
Luego, en su vista descarga, vincule su vista al teclado
fuente
¿Por qué no implementar esto en un UITableViewController en su lugar? El teclado no ocultará ningún campo de texto cuando se muestre.
fuente
Swift 4 (** actualizado ) con extensión **
inViewDidLoad
agregue la siguiente extensión
fuente
Utilizo SwiftLint, que tuvo algunos problemas con el formato de la respuesta aceptada. Específicamente:
sin espacio antes de los dos puntos, sin fuerza de lanzamiento, prefiera UIEdgeInset (arriba: etc ... en lugar de UIEdgeInsetMake.
así que aquí están esas actualizaciones para Swift 3
fuente
Creo que esta cláusula está mal:
Si bien el origen de activeField puede estar por encima del teclado, el maxY podría no ...
Crearía un punto 'máximo' para activeField y comprobaría si está en el teclado Rect.
fuente
Aquí está mi versión después de leer la documentación proporcionada por Apple y las publicaciones anteriores. Una cosa que noté es que el textView no se manejó cuando estaba cubierto por el teclado. Desafortunadamente, la documentación de Apple no funcionará porque, por cualquier razón, el teclado se llama DESPUÉS de que se llama a textViewDidBeginEditing. Manejé esto llamando a un método central que verifica si se muestra el teclado Y si se está editando un textView o textField. De esta manera, el proceso solo se activa cuando AMBAS condiciones existen.
Otro punto con textViews es que su altura puede ser tal que el teclado recorta la parte inferior de textView y no se ajustaría si el punto superior izquierdo de la vista estuviera a la vista. Entonces, el código que escribí en realidad toma el punto Inferior-Izquierdo referenciado por la pantalla de cualquier textView o textField y ve si cae en las coordenadas referenciadas en la pantalla del teclado presentado, lo que implica que el teclado cubre una parte de él.
Si está utilizando un controlador de navegación, la subclase también establece el ajuste automático de la vista de desplazamiento para las inserciones en falso.
Recorre cada textView y textField para establecer delegados para el manejo
Simplemente configure su clase base en la subclase creada aquí para obtener resultados.
fuente
Ya se dan respuestas impresionantes, pero esta es una forma diferente de lidiar con esta situación (usando Swift 3x ):
En primer lugar, llame al siguiente método en
viewWillAppear()
Ahora tome una
IBOutlet
deUIView
las principales restricciones de suUIViewcontroller
estilo de esta manera: (aquíUIView
está la subvista deUIScrollView
eso significa que debe tener unUIScrollView
para todos sussubViews
)Y otra variable como seguir y agregar un delegado, es decir
UITextFieldDelegate
:Después de eso, aquí está la parte mágica, solo pegue este fragmento a continuación :
Ahora el último fragmento:
No olvide asignar delegados a todos sus
UITextField
correos electrónicos.UIStoryboard
¡Buena suerte!
fuente
Sintaxis de Swift 3:
este es un buen método para obtener lo que desea, puede agregar condiciones "si" para ciertos campos de texto, pero este tipo funciona para todos ... Espero que pueda ser útil para todos
fuente
En primer lugar, declare una variable para identificar su UITextField activo.
Paso 1:-
Me gusta como
var activeTextField: UITextField
?Paso 2: - Después de esto, agregue estas dos líneas en viewDidLoad.
Paso 3:-
Ahora defina estos dos métodos en su clase de controlador.
fuente
Hacer una var de uitextfield
En su vista, cargamos
Conozca el campo de texto cliqueado. probablemente tenga campos de texto en toda la pantalla.
Compruebe si el teclado está cubriendo el campo de texto o no.
Regresar al teclado cerrado
ACTUALIZACIÓN: NSNotification.Name.UIKeyboardWillShow y NSNotification.Name.UIKeyboardWillHide se renombran a UIResponder.keyboardWillShowNotification y UIResponder.keyboardWillHideNotification respectivamente.
fuente
Swift : puede hacer esto comprobando qué textField se presenta.
fuente
Este código sube el campo de texto que está editando para que pueda verlo en Swift 3 para esta respuesta, también debe hacer que su vista sea un UITextFieldDelegate:
Y luego en viewDidLoad:
Qué llamadas (fuera de viewDidLoad):
fuente
Swift 3
fuente
La respuesta aceptada es casi perfecta. Pero necesito usar en
UIKeyboardFrameEndUserInfoKey
lugar deUIKeyboardFrameBeginUserInfoKey,
porque este último devuelve la altura 0 del keyborad. Y cambia el punto de prueba al fondo, no el origen.fuente
Swift 4 actualizó mi solución
con animación de restricción en el teclado show / hide, disfruta.
fuente
Swift 4
Puede moverse fácilmente hacia arriba y hacia abajo
UITextField
con el teclado con animaciónfuente
Swift 4.2
Mi solución centrará (verticalmente) la vista en
UITextField
si su posición está debajo del teclado.Paso 1: Cree un nuevo archivo rápido y copie y pegue la
UIViewWithKeyboard
clase.Paso 2: en Interface Builder configúrelo como una Clase personalizada para su máximo rendimiento
UIView
.fuente
Reescrito para swift 4.2
En ViewDidLoad ..
Funciones restantes
fuente
"Olvidé mencionar que soy nuevo en Swift :( ¿Cuál sería la sintaxis correcta para verificar esto? (¿Cómo obtengo el nombre del campo en esta función?)"
Okay . Primero confirme con el protocolo UITextFieldDelegate
Luego implemente la función
Debe tener en cuenta que el enfoque adecuado es usar una vista de desplazamiento y colocar la vista que debe desplazarse hacia arriba / abajo dentro de la vista de desplazamiento y manejar los eventos del teclado en consecuencia
fuente
Para Swift 4.2
Este código le permitirá controlar el momento del eje Y del marco para un tamaño de pantalla de dispositivo específico.
PD: este código no moverá de forma inteligente el marco según la ubicación de TextField.
Crear una extensión para UIDevice
Agregar NotificationObserver en viewDidLoad
Selector
fuente