Tengo una aplicación donde, en Interface Builder , configuré una UIView
que tiene un campo de texto cerca de la parte inferior de la vista. Cuando ejecuto la aplicación e intento ingresar texto en ese campo, el teclado se desliza hacia arriba del campo para que no pueda ver lo que estoy escribiendo hasta que vuelva a ocultar el teclado.
¿Alguien más se ha encontrado con este problema y ha encontrado una buena manera de resolverlo sin hacer que la vista principal se pueda desplazar o mover el campo de texto más arriba en la pantalla?
ios
iphone
keyboard
uitextfield
Cruinh
fuente
fuente
Respuestas:
La solución habitual es deslizar el campo (y todo lo que está sobre él) hacia arriba con una animación, y luego hacia abajo cuando haya terminado. Es posible que deba colocar el campo de texto y algunos de los otros elementos en otra vista y deslizar la vista como una unidad. (Yo llamo a estas cosas "placas" como en "placas tectónicas", pero solo soy yo). Pero aquí está la idea general si no necesitas ponerte elegante.
fuente
Esto funcionó de maravilla para mí deslizando uitextfields
En particular, tiene la ventaja de calcular la distancia de animación de la diapositiva dependiendo de la posición del campo de texto.
fuente
IQKeyboardManager hace esto por usted SIN LÍNEA DE CÓDIGO , solo necesita arrastrar y soltar el archivo fuente relacionado al proyecto. IQKeyboardManager también es compatible con la orientación del dispositivo , la gestión automática de UIToolbar , keyboardDistanceFromTextField y mucho más de lo que piensa.
Aquí está el diagrama de flujo de control:
Paso 1: - Añadido notificaciones globales de
UITextField
,UITextView
yUIKeyboard
en una clase Singleton. Lo llamé IQKeyboardManager .Paso 2: - Si lo encuentra
UIKeyboardWillShowNotification
,UITextFieldTextDidBeginEditingNotification
oUITextViewTextDidBeginEditingNotification
las notificaciones, a continuación, tratar de obtenertopMostViewController
la instancia de laUIWindow.rootViewController
jerarquía. Con el fin de destapar adecuadamenteUITextField
/UITextView
en él,topMostViewController.view
's marco necesita ser ajustado.Paso 3: - Distancia de movimiento esperada calculada
topMostViewController.view
con respecto a la primera respuestaUITextField
/UITextView
.Paso 4: - Movido
topMostViewController.view.frame
hacia arriba / abajo de acuerdo a la distancia medida que se espera.Paso 5: - Si se encuentra
UIKeyboardWillHideNotification
,UITextFieldTextDidEndEditingNotification
oUITextViewTextDidEndEditingNotification
notificación, intente nuevamente obtener latopMostViewController
instancia de laUIWindow.rootViewController
jerarquía.Paso 6: - La distancia perturbada calculada de la
topMostViewController.view
cual debe restaurarse a su posición original.Paso 7: - Restaurado
topMostViewController.view.frame
según la distancia perturbada.Paso 8: - Instancia de instancia IQKeyboardManager singleton instanciada en la carga de la aplicación, por lo que cada
UITextField
/UITextView
en la aplicación se ajustará automáticamente de acuerdo con la distancia de movimiento esperada.Eso es todo
fuente
Para ampliar la respuesta de Amagrammer, aquí hay una clase de muestra:
LoginViewController.h
Observe que estamos implementando el "UITextFieldDelegate"
LoginViewController.m
fuente
UIApplicationDidEnterBackgroundNotification
, de lo contrario, se moverá más hacia abajo si uno presiona el botón Inicio y vuelve a entrar en la aplicación, lo que hace que sea feo y tenga errores.¿Qué tal la solución oficial: mover el contenido que se encuentra debajo del teclado?
fuente
Tengo el mismo problema en
UITableView
las celdas textField. Resuelvo este problema implementando el siguiente método para escuchar la notificación del teclado.Observador de las notificaciones aquí:
Maneje esas notificaciones utilizando la siguiente función:
fuente
Mira esto. Sin problemas para ti.
Esta solución es muy ordenada. Todo lo que tiene que hacer es agregar sus campos de texto en ay
UIScrollView
cambiar su clase aTPKeyboardAvoidingScollView
, si está usando guiones gráficos. La vista de desplazamiento se extiende de tal manera que detectaría cuando el teclado es visible y se moverá por encima del teclado a una distancia razonable. Es la solución perfecta porque es independiente de suUIViewController
. Todo lo necesario se hace dentro de la clase mencionada anteriormente. Gracias Michael Tyson y todos.TPKeyboardEvitar
fuente
A continuación se muestra una versión rápida de la respuesta de Amagrammer. Además, una variación usando el evento UIKeyboardWillShowNotification ya que necesitaba saber el tamaño del teclado antes de quitar la vista del camino.
fuente
Hubo un gran recorrido en la edición de campos de texto sin oscurecer (enlace muerto ahora, aquí hay un enlace Wayback: https://web.archive.org/web/20091123074029/http://acts-as-geek.blogspot.com/2009/ 11 / edición-textfields-without-obscuring.html ). Muestra cómo mover un existente
UIView
a unUIScrollView
, y desplazarlo automáticamente cuando aparece el teclado.Lo actualicé un poco para calcular la altura correcta para
UIScrollView
cuando hay controles (como aUITabBar
) debajo deUIScrollBar
. Ver publicación uiview de actualización .fuente
Aquí hay una solución usando Xcode5, iOS7:
Use los bloques UITextfieldDelegate y de animación.
Este es casi todo el código para ViewController, pero quería incluir el código de delegado para aquellos que aún no están familiarizados con el patrón de delegado (como yo). También incluí código para ocultar el teclado cuando toca fuera de la vista de texto.
Puede mover las vistas (botones, campos de texto, etc.) tan alto como desee, solo asegúrese de volver a colocarlas en su lugar (+100 y luego -100).
fuente
Supongo que una forma sería mover la posición de todas sus vistas de (x, y) a (x, y-keybaardHeight) cuando se hace clic en el campo de texto y volver a colocarlo cuando se cierra el teclado, puede parecer un poco extraño ya que la vista solo aparece (tal vez no sería malo si lo animas).
fuente
Además de la solución de Amagrammer, si está utilizando cocos2d en modo vertical, cambie esta línea:
a esto:
Si está utilizando cocos2d en modo horizontal, realice el cambio anterior y cambie los
up
valores entextFieldDidBeginEditing:
ytextFieldDidEndEditing:
fuente
Tuve el mismo problema y descubrí que GTKeyboardHelper era una salida fácil.
Después de arrastrar y soltar el marco en su proyecto, incluya el archivo de encabezado. Descargue y abra el proyecto de ejemplo, luego arrastre el objeto "Keyboard Helper" desde la sección de objetos en el xib a la sección de objetos en el generador de interfaz de su proyecto.
Arrastre y suelte todas sus vistas para ser hijos de "Keyboard Helper".
fuente
Arrastrar y soltar el marco que utilizo en mis proyectos. Admite el despido automático cuando toca fuera de un primer respondedor o cuando se desplaza.
GTKeyboardHelper
fuente
Simplemente deslice la vista hacia arriba y hacia abajo según sea necesario:
No olvide establecer
self
comoUITextFieldDelegate
y como el campo de texto realdelegate
.(Gracias a Ammagrammer, esta es solo una respuesta más corta usando bloques para animaciones)
fuente
Tengo algo más si quieres. El punto aquí es que desea establecer el centro de su UIView en el campo de texto que está editando.
Antes de eso, debe guardar su INITIAL_CENTER , como CGPoint , de self.view.center y su INITIAL_VIEW como CGRect de self.view.frame en una propiedad const.
Puedes crear un método como este:
Luego, en su UITextFieldDelegate , debe llamar a centerOn: (CGRect) en los siguientes métodos:
textFieldDidBeginEditing: (UITextField *) con, como parámetro, el marco del campo de texto en el que desea centrarse.
Y tiene que llamarlo en su controlador de eventos, donde cierra su teclado,
textFieldDidEndEditing: (UITextField *) puede ser una de las formas de hacerlo, colocando INITIAL_VIEW como un parámetro de centerOn: (CGRect) .
fuente
Creo que en las versiones más recientes de iOS (6.1+, posiblemente incluso antes), la vista subyacente, al menos para UITableView, se contrae automáticamente cuando aparece el teclado. Por lo tanto, solo necesita hacer que el campo de texto sea visible en esa vista. En
init
:luego:
fuente
https://github.com/ZulwiyozaPutra/Shift-Keyboard-Example Espero que esta solución haya ayudado. Todos están escritos en Swift 3.
fuente