skip to Main Content

In the following code snippet, I use proxy.scrollTo() to scroll to a target. In order to animate the scrolling process, I wrapped this function call inside withAnimation. This code works on iOS 16, but not on iOS 17. In iOS 17, it does scroll, but without any animation. Is this a bug or is there an API change? Thanks!

import SwiftUI

struct ScrollTest: View {
    var body: some View {
        ScrollViewReader { proxy in
            List {
                Button("Scroll") {
                    withAnimation {
                        proxy.scrollTo(15, anchor: .top)
                    }
                }
                
                ForEach(1..<50) { i in
                    Text("Item (i)")
                        .id(i)
                }
            }
        }
    }
}

2

Answers


  1. Okay so turns out there’s been a deprecation in the API, ScrollViewReader is now deprecated and replaced with a new .scrollPosition() modifier.

    struct ContentView: View {
        @State private var position: Int?
        
        var body: some View {
            ScrollView {
                LazyVStack {
                    Button("Jump...") {
                        withAnimation {
                        position = 99
                     }
                   }
                    
                    ForEach(0..<100) { index in
                        Rectangle()
                            .fill(Color.green.gradient)
                            .frame(height: 300)
                            .id(index)
                    }
                }
                .scrollTargetLayout()
            }
            .scrollPosition(id: $position)
        }
    }
    
    Login or Signup to reply.
  2. Apple documentation doesn’t indicate ScrollViewReader as deprecated. Though I’m experiencing a lot of bugs with ScreenViewReader.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search