Después de mucho ensayo y error, me doy por vencido y hago la pregunta. He visto a muchas personas con problemas similares pero no puedo obtener todas las respuestas para que funcionen correctamente.
tengo un UITableView
que se compone de celdas personalizadas. Las celdas están formadas por 5 campos de texto uno al lado del otro (algo así como una cuadrícula).
Cuando trato de desplazarme y editar las celdas en la parte inferior del UITableView
, no puedo lograr que mis celdas se coloquen correctamente sobre el teclado.
He visto muchas respuestas hablando sobre cambiar el tamaño de las vistas, etc. pero ninguna de ellas ha funcionado bien hasta ahora.
¿Alguien podría aclarar la forma "correcta" de hacer esto con un ejemplo de código concreto?
Respuestas:
Si usa UITableViewController en lugar de UIViewController, lo hará automáticamente.
fuente
La función que realiza el desplazamiento podría ser mucho más simple:
Eso es. No hay cálculos en absoluto.
fuente
contentInset
, que aparentemente no se tiene en cuenta al solicitarvisibleRows
oindexPathsForVisibleRows
.Estoy haciendo algo muy similar, es genérico, no es necesario calcular algo específico para su código. Simplemente verifique los comentarios en el código:
En MyUIViewController.h
En MyUIViewController.m
Versión Swift 1.2+:
fuente
[tableView scrollToRowAtIndexPath: indexPath atScrollPosition: UITableViewScrollPositionMiddle animated: YES];
MyAppDelegate *appDelegate = (MyAppDelegate*)[[UIApplication sharedApplication] delegate]; CGFloat tabBarHeight = appDelegate.tabBarController.tabBar.frame.size.height;
luego reste tabBarHeight de la altura del teclado donde sea que use la altura del teclado.La solución más simple para Swift 3 , basada en la solución Bartłomiej Semańczyk :
fuente
Notification
lugar deNSNotification
sería más "Swift 3-y" :-)Tuve el mismo problema pero noté que aparece solo en una vista. Entonces comencé a buscar las diferencias en los controladores.
Descubrí que el comportamiento de desplazamiento se establece en
- (void)viewWillAppear:(BOOL)animated
la súper instancia.Así que asegúrese de implementar así:
Y no importa si usa
UIViewController
oUITableViewController
; lo verificó colocando unUITableView
como subvista de self.view en elUIViewController
. Fue el mismo comportamiento. La vista no permitía desplazarse si[super viewWillAppear:animated];
faltaba la llamada .fuente
Puede que me haya perdido esto, ya que no leí toda la publicación aquí, pero lo que se me ocurrió parece engañosamente simple. No lo he pasado por alto, probando en todas las situaciones, pero parece que debería funcionar bien.
simplemente ajuste el contentInset de la vista de tabla por la altura del teclado y luego desplace la celda hacia abajo:
y por supuesto
¿Es esto demasiado simple? ¿Me estoy perdiendo de algo? hasta ahora está funcionando bien para mí, pero como dije, no lo he exprimido ...
fuente
[aNotification.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue]
contentInset
ni cambiará bruscamente los límites de desplazamiento.Creo que he encontrado la solución para que coincida con el comportamiento de las aplicaciones de Apple.
Primero, en su viewWillAppear: suscríbase a las notificaciones del teclado, para que sepa cuándo se mostrará y se ocultará el teclado, y el sistema le dirá el tamaño del teclado, pero no se olvide de anular el registro en su viewWillDisappear :.
Implemente los métodos similares a los siguientes para que ajuste el tamaño de su tableView para que coincida con el área visible una vez que se muestra el teclado. Aquí estoy rastreando el estado del teclado por separado para poder elegir cuándo volver a configurar la tabla Vista a la altura completa, ya que obtienes estas notificaciones en cada cambio de campo. No olvide implementar keyboardWillHide: y elija un lugar apropiado para arreglar su tamaño tableView.
Ahora aquí está el bit de desplazamiento, primero trabajamos algunos tamaños, luego vemos dónde estamos en el área visible y establecemos el rectángulo al que queremos desplazar para que sea la vista media arriba o debajo del centro del campo de texto basado en donde está en la vista. En este caso, tenemos una matriz de UITextFields y una enumeración que los rastrea, por lo que multiplicar la altura de fila por el número de fila nos da el desplazamiento real del marco dentro de esta vista externa.
Esto parece funcionar bastante bien.
fuente
UIKeyboardBoundsUserInfoKey
está en desuso a partir de iOS 3.2. Vea mi solución a continuación que funciona en todas las versiones actuales de iOS ≥ 3.0. / @ iPhoneDevSi puede usar
UITableViewController
, obtiene la funcionalidad de forma gratuita. A veces, sin embargo, esta no es una opción, específicamente si necesita múltiples vistas, no solo laUITableView
.Algunas de las soluciones presentadas aquí no funcionan en iOS ≥4, algunas no funcionan en iPad o en modo horizontal, algunas no funcionan para teclados Bluetooth (donde no queremos ningún desplazamiento), algunas no funciona al cambiar entre múltiples campos de texto. Entonces, si elige cualquier solución, asegúrese de probar estos casos. Esta es la solución que
utilizamosutilizamos en InAppSettingsKit :Aquí está el código completo de la clase en InAppSettingsKit. Para probarlo, use el panel secundario "Lista completa" donde puede probar los escenarios mencionados anteriormente.
fuente
La solución más simple para Swift :
fuente
Espero que ya tengan una solución para leer todos esos. Pero encontré mi solución de la siguiente manera. Espero que ya tengas una celda
UITextField
. Entonces, al prepararse, simplemente mantenga el índice de la fila en la etiqueta del campo de texto.Cree una
activeTextField
instancia deUITextField
con alcance global como se muestra a continuación:Entonces, ahora solo copia y pega mi código al final. Y tampoco olvides agregar
UITextFieldDelegate
Registra el teclado
notifications
Maneja el teclado
Notifications
:Llamado cuando
UIKeyboardDidShowNotification
se envía el.Se llama cuando
UIKeyboardWillHideNotification
se envíaAhora queda una cosa, llame al
registerForKeyboardNotifications
método alViewDidLoad
método de la siguiente manera:Ya terminaste, espero que tu
textFields
teclado ya no esté oculto.fuente
Combinando y completando los espacios en blanco de varias respuestas (en particular, Ortwin Gentz, usuario 98013) y otra publicación, esto funcionará de fábrica para SDK 4.3 en un iPad en modo vertical u horizontal:
fuente
Si usa una vista uitableview para colocar sus campos de texto ( de Jeff Lamarche ), puede simplemente desplazar la vista de tabla usando el método delegado de esta manera.
(Nota: mis campos de texto se almacenan en una matriz con el mismo índice que la fila en la vista de tabla)
fuente
Las notificaciones del teclado funcionan, pero el código de muestra de Apple supone que la vista de desplazamiento es la vista raíz de la ventana. Usualmente este no es el caso. Debe compensar las barras de pestañas, etc., para obtener el desplazamiento correcto.
Es más fácil de lo que parece. Aquí está el código que uso en un UITableViewController. Tiene dos variables de instancia, hiddenRect y keyboardShown.
fuente
UIKeyboardCenterEndUserInfoKey
yUIKeyboardBoundsUserInfoKey
están en desuso a partir de iOS 3.2. Vea mi solución a continuación que funciona en todas las versiones actuales de iOS ≥ 3.0.Si usa
Three20
, entonces use laautoresizesForKeyboard
propiedad. Simplemente configure el-initWithNibName:bundle
método de su controlador de vistaEsto se encarga de:
Hecho y hecho.
fuente
Mi acercamiento:
Primero subclases UITextField y agrego una propiedad indexPath. En el método CellFor ... entrego la propiedad indexPath.
Luego agrego el siguiente código:
al textFieldShould / WillBegin ... etc.
Cuando el teclado desaparece, debes invertirlo con:
fuente
Una solución más fluida. Se desliza en los métodos de delegado de UITextField, por lo que no requiere de mensajes con notificaciones de UIKeyboard.
Notas de implementación:
kSettingsRowHeight: la altura de un UITableViewCell.
offsetTarget y offsetThreshold se basan en kSettingsRowHeight. Si usa una altura de fila diferente, establezca esos valores en la propiedad y del punto. [alt: calcula el desplazamiento de fila de una manera diferente.]
}
}
fuente
UITextField's
delegate
Método de uso :Rápido
C objetivo
fuente
Solución completa Swift 4.2
He creado GIST con un conjunto de protocolos que simplifica el trabajo con la adición de espacio adicional cuando se muestre el teclado, oculta o se cambia.
Caracteristicas :
Uso
Ejemplo de uso básico en el controlador de vista que contiene alguna vista de desplazamiento (la vista de tabla también es compatible, por supuesto).
Núcleo: el marco cambia al observador
El protocolo
KeyboardChangeFrameObserver
activará el evento cada vez que se cambie el marco del teclado (incluyendo mostrar, ocultar, cambiar el marco).addKeyboardFrameChangesObserver()
alviewWillAppear()
o método similar.removeKeyboardFrameChangesObserver()
alviewWillDisappear()
o método similar.Implementación: vista de desplazamiento
ModifableInsetsOnKeyboardFrameChanges
El protocolo agregaUIScrollView
soporte al protocolo central. Cambia las inserciones de la vista de desplazamiento cuando se cambia el marco del teclado.Su clase necesita configurar la vista de desplazamiento, las inserciones de uno aumentarán / disminuirán con los cambios en el marco del teclado.
fuente
Dado que tiene campos de texto en una tabla, la mejor manera es cambiar el tamaño de la tabla: debe configurar tableView.frame para que sea más pequeño en altura por el tamaño del teclado (creo que alrededor de 165 píxeles) y luego expandirlo nuevamente cuando Se descarta el teclado.
Opcionalmente, también puede deshabilitar la interacción del usuario para tableView en ese momento, si no desea que el usuario se desplace.
fuente
Esto funciona perfectamente, y también en iPad.
fuente
Intenté casi el mismo enfoque y se me ocurrió un código más simple y más pequeño para el mismo. Creé un IBOutlet iTextView y lo asocié con el UITextView en el IB.
fuente
Entonces, después de horas de trabajo agotador tratando de usar estas soluciones actuales (y fallando por completo), finalmente conseguí que las cosas funcionaran bien y las actualicé para usar los nuevos bloques de animación. Mi respuesta se basa completamente en la respuesta de Ortwin anterior .
Entonces, por alguna razón, el código anterior simplemente no funcionaba para mí. Mi configuración parecía bastante similar a los demás, pero tal vez porque estaba en un iPad o 4.3 ... no tengo idea. Estaba haciendo algunos cálculos extravagantes y disparaba mi vista de la mesa fuera de la pantalla.
Vea el resultado final de mi solución: http://screencast.com/t/hjBCuRrPC (ignore la foto. :-P)
Así que seguí con lo esencial de lo que estaba haciendo Ortwin, pero cambié la forma en que hacía algunas matemáticas para sumar el origen, tamaño y altura de la vista de mi tabla con la altura del teclado. Cuando resta la altura de la ventana de ese resultado, me dice cuánta intersección tengo. Si es mayor que 0 (también conocido como cierta superposición), realizo la animación de la altura del cuadro.
Además, hubo algunos problemas de redibujo que se resolvieron 1) Esperando para desplazarse a la celda hasta que se realizó la animación y 2) utilizando la opción UIViewAnimationOptionBeginFromCurrentState al ocultar el teclado.
Un par de cosas a tener en cuenta.
Nuevamente, no habría llegado a esta respuesta si Ortwin no hubiera proporcionado el quid de la misma. Aquí está el código:
fuente
Esta solución funciona para mí, TENGA EN CUENTA la línea
Puede cambiar el valor de 160 para que coincida con usted.
fuente
Muy interesante hilo de discusión, también enfrenté el mismo problema, puede ser peor porque
Entonces leí los hilos aquí e implementé mi versión, lo que me ayudó a subir mis contenidos en iPad en modo horizontal . Aquí está el código (esto no es infalible y todo, pero solucionó mi problema) Primero debe tener un delegado en su clase de celda personalizada, que al comenzar la edición, envía el campo de texto a su controlador de vista y establece el campo activo = theTextField allí
// IMPLEMENTADO PARA MANEJAR EL MODO DE PAISAJE SOLAMENTE
// Se llama cuando se envía UIKeyboardWillHideNotification
-anoop4real
fuente
Acabo de resolver ese problema por mí mismo después de referir una gran cantidad de soluciones encontradas a través de Google y Stack Overflow.
Primero, asegúrese de haber configurado un IBOutlet de su UIScrollView, luego observe detenidamente Apple Doc: Administración de teclado . Finalmente, si puede desplazarse por el fondo, pero el teclado aún cubre los campos de texto, eche un vistazo a este código:
La principal diferencia entre esta pieza y la de Apple radica en la condición if. Creo que el cálculo de Apple de la distancia de desplazamiento y la condición de si el campo de texto cubierto por el teclado no es preciso, por lo que realicé mi modificación como se indicó anteriormente.
Déjame saber si funciona
fuente
Un ejemplo en Swift, usando el punto exacto del campo de texto de Get indexPath de UITextField en UITableViewCell con Swift :
fuente
Otro método fácil (solo funciona con una sección)
fuente
Si su UITableView es administrado por una subclase de UITableViewController y no UITableView, y el delegado del campo de texto es el UITableViewController, debe administrar todo el desplazamiento automáticamente; todos estos otros comentarios son muy difíciles de implementar en la práctica.
Para un buen ejemplo, vea el proyecto de código de ejemplo de Apple: TaggedLocations.
Puede ver que se desplaza automáticamente, pero no parece haber ningún código que haga esto. Este proyecto también tiene celdas de vista de tabla personalizadas, por lo que si crea su aplicación con ella como guía, debería obtener el resultado deseado.
fuente
Así es como hice que esto funcionara, que es una mezcla de las respuestas de Sam Ho y Marcel W, y algunas de mis propias correcciones de errores en mi código. Estaba usando un UITableViewController. La tabla ahora cambia de tamaño correctamente cuando se muestra el teclado.
1) En
viewDidLoad
agregué:self.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
2) Había olvidado llamar a los
super
equivalentes enviewWillAppear
yawakeFromNib
. Agregué estos nuevamente.fuente
UITableViewController
hace el desplazamiento automáticamente, de hecho. La diferencia en comparación con el uso de aUIViewController
es que debe crear Navbar-Buttonitems mediante programación utilizandoNavigationController
, cuando se utiliza aTableViewController
.fuente