Xcode Version 12.4 (12D4e)
I have encountered this every time I have implemented a Lazy stack within a ScrollView:
- Add a
LazyHStack
to a horizontalScrollView
or aLazyVStack
to a verticalScrollView
- Add enough content such that the content size of the scroll view exceeds its bounds
Scenario 1 - Pull the scrollview beyond the bounds (as if you were pulling to refresh)
Expected behavior: It behaves as expected where the scrollview stays under your finger
Observed behavior: It stutters and jumps
Scenario 2 - Scroll fast to the edge so that it has to bounce
Expected behavior: It bounces smoothly
Observed behavior: It stops and jitters when it reaches the edge, but doesn't bounce
My theory My theory is that due to using a Lazy stack, when a view goes off the screen it gets removed from the view hierarchy, creating a stutter.
I'm wondering if anyone else has encountered this? Is this a bug in SwiftUI? I've reliably reproduced this for months across different projects and end up resorting to not using Lazy stacks which I wish I could.
Sample code
ScrollView {
LazyVStack {
ForEach(viewModel.items) { items in
SomeView(viewModel: .init(context: viewModel.context, item: item))
}
}
Note: Stutter only happens at the top of the scroll view
** Updated July 10, 2021 **
This is still happening in iOS 15, Version 13.0 beta (13A5155e).
In the video below, notice the behavior of the scrollbar and the stuttering when we get to the bottom:
** Updated July 19, 2021 **
I ripped everything out in my view and built it back up one by one — the LazyVStack begins to stutter as soon as I put a VStack/HStack/ZStack
around a simple Text
element.
If I add fixedSize(horizontal: false, vertical: true)
to the Text
element it seems to stop stuttering. As soon as I add a UIViewRepresentable
of variable height, it starts to stutter again.
It seems like in a LazyStack, every child needs to be some sort of fixed size or a purely SwiftUI view to work.
I'll keep digging in. Must... solve...
** Updated Feb 24, 2024 **
After a long hiatus, I'm back to SwiftUI and I am seeing that the LazyVStack no longer stutters when it's in a ScrollView.
I'm not sure what version fixed this, but hurrah!
Xcode: 15.2 iOS: 17.4