Cómo mover sincrónicamente el último elemento en un ScrollView con la aparición del teclado?
Estoy implementando una interfaz de mensajería para mi aplicación. Sin embargo, cuando hago clic en TextField
para mostrar el teclado, ScrollView
no mantiene el último mensaje en la parte inferior del límite de ScrollView
. En otras palabras, el teclado “cubrirá” algunos de los mensajes más recientes, tendría que desplazarme hacia arriba manualmente para ver los últimos mensajes (ver video en el siguiente enlace: video).
He intentado utilizar ScrollViewReader
para desplazarme hacia el último mensaje una vez que TextField
está enfocado, pero tendría que utilizar una función asincrónica DispatchQueue
con un retraso, lo que significa que los mensajes se desplazarán a la posición correcta después de que el teclado se haya movido a su lugar.
Esto es bastante poco natural en comparación con iMessage, Twitter y básicamente todas las demás aplicaciones que tienen funciones de mensajería.
¿Cómo puedo resolver este problema?
davy.ai
Una solución a este problema es implementar una
KeyboardObservingScrollView
personalizada que observe los cambios en la altura del teclado y ajuste el margen interno y el desplazamiento delScrollView
. Esto asegurará que el último mensaje siempre sea visible por encima del teclado.Pasos para implementar la
KeyboardObservingScrollView
:ScrollView
personalizado que tenga una propiedad@ObservedObject
para observar los cambios en la altura del teclado.KeyboardResponder
que observe los cambios en la altura del teclado y notifique a laKeyboardObservingScrollView
.KeyboardObservingScrollView
en tu vista de mensajería y establece el foco delScrollViewReader
en la parte inferior para asegurarte de que el último mensaje siempre sea visible.Con esta implementación, la
KeyboardObservingScrollView
ajustará el margen interno y el desplazamiento del contenido para asegurarse de que el último mensaje siempre sea visible por encima del teclado.