XCode Versión 12.4 (12D4e)
Me encontré con esto cada vez que implementé una pila Lazy dentro de ScrollView:
LazyHStack a un ScrollView horizontal o un LazyVStack a un ScrollView verticalEscenario 1: tire de la vista de desplazamiento más allá de los límites (como si estuviera tirando para actualizar)
Comportamiento esperado : se comporta como se esperaba donde la vista de desplazamiento permanece bajo su dedo
Comportamiento observado : Tartamudea y salta
Escenario 2: desplácese rápido hasta el borde para que tenga que rebotar
Comportamiento esperado : Rebota suavemente
Comportamiento observado : Se detiene y tiembla cuando llega al borde, pero no rebota
Mi teoría Mi teoría es que, debido al uso de una pila Lazy, cuando una vista sale de la pantalla, se elimina de la jerarquía de vistas, creando un tartamudeo.
Me pregunto si alguien más se ha encontrado con esto. ¿Es esto un error en SwiftUI? He reproducido esto de manera confiable durante meses en diferentes proyectos y termino recurriendo a no usar Lazy Stacks, lo que desearía poder hacer.
Código de muestra
ScrollView { LazyVStack { ForEach(viewModel.items) { items in SomeView(viewModel: .init(context: viewModel.context, item: item)) } }Nota: el tartamudeo solo ocurre en la parte superior de la vista de desplazamiento
** Actualizado el 10 de julio de 2021 **
Esto sigue ocurriendo en iOS 15, versión 13.0 beta (13A5155e).
En el video a continuación, observe el comportamiento de la barra de desplazamiento y el tartamudeo cuando llegamos al final:
** Actualizado el 19 de julio de 2021 **
Arranqué todo lo que estaba a mi vista y lo construí de nuevo uno por uno: LazyVStack comienza a tartamudear tan pronto como coloco un VStack/HStack/ZStack alrededor de un elemento de Text simple.
Si agrego fixedSize(horizontal: false, vertical: true) al elemento Text , parece que deja de tartamudear. Tan pronto como agrego un UIViewRepresentable de altura variable, comienza a tartamudear nuevamente.
Parece que en un LazyStack, cada niño debe tener algún tipo de tamaño fijo o una vista puramente SwiftUI para funcionar.
Seguiré investigando. Debo... resolver...
Recibí una respuesta del DTS y confirmaron que es un error, pero no hay solución. Puede hacer referencia a mi ID de comentarios y presentar un elemento de comentarios. Me imagino que lo abordarán con la nueva versión rápida, porque creo que probablemente sea un defecto heredado y podría causar cambios importantes. En otras palabras, tiene que ver con los componentes nativos y la barra de navegación, y tienen que romper algunas cosas para arreglarlo. Esto significa que las aplicaciones de SwiftUI en iOS 14 podrían no ser compatibles nunca. Pero solo estoy especulando. Les avisaré a todos si tengo alguna noticia. Es realmente un bloqueador importante y arruina por completo la experiencia del usuario en mi opinión.
Confirmé que el problema se resolvió en iOS 15. No estoy seguro de si esto ayudó, pero también volví a compilar la aplicación con Xcode 13. 🚀
Puedo confirmar que el problema del tartamudeo todavía está presente en iOS 15 con Xcode 13. No estoy seguro de qué lo está causando, pero parece estar relacionado con la forma en que LazyStacks crea y diseña elementos.
Este es un MWE que reproduce el problema:
ScrollView(.horizontal) { LazyHStack { Color.red.frame(width: 450) Color.green.frame(width: 250) Color.blue.frame(width: 250) } } .frame(width: 350)En este ejemplo, el marco del color rojo parece "lo suficientemente ancho" como para provocar el tartamudeo cuando rebota en el borde delantero de la pantalla.
Reducir ligeramente el ancho hace que el tartamudeo desaparezca:
ScrollView(.horizontal) { LazyHStack { Color.red.frame(width: 400) Color.green.frame(width: 250) Color.blue.frame(width: 250) } } .frame(width: 350)Nota: probado en un iPhone Xs Max con Xcode 13 beta 1 y iOS 15 beta 1. Para este ejemplo en particular, el problema solo ocurre en el dispositivo (tal vez porque no puedo desplazarme lo suficientemente rápido en el simulador). Pero también he tenido este problema en vistas más complejas en el simulador.
Intente deshabilitar el rebote de ScrollView. Agregue la siguiente línea en onAppear o init,
UIScrollView.appearance().bounces = false
Agregué un rectángulo claro
ScrollView { LazyVStack { Rectangle().foregroundColor(.clear).frame(height: 1.0) ... } }y pareció resolver la mayoría de mis problemas que tengo con la tartamudez en LazyVStack en ScrollView.