// // AutoScrollView.swift // OnCue // // Created by Pradyun Setti on 23/06/2024. // import SwiftUI import SwiftData //struct AutoScrollView: View { // let content: Content // var scrollSpeed: Double = 15.0 // // @State private var offset: Double = 0.0 // // init(scrollSpeed: Double = 0, @ViewBuilder _ content: () -> Content) { // self.content = content() // self.scrollSpeed = scrollSpeed // } // // var body: some View { // ScrollView { // content // .offset(y: offset) // } // } // // func startScrolling() { // // } // // func stopScrolling() { // // } // // mutating func setScrollSpeed(_ speed: Double) { // self.scrollSpeed = speed // } //} struct AutoScrollView: View { @State private var scrollOffset: CGFloat = 0 @State private var timer: Timer? = nil let content: Content var scrollSpeed: CGFloat = 0.5 // Adjust this value to control the scroll speed init(scrollSpeed: Double = 0.7, @ViewBuilder _ content: () -> Content) { self.content = content() self.scrollSpeed = scrollSpeed } var body: some View { ScrollView { VStack { content .padding() .background(GeometryReader { geo in Color.clear.onAppear { // Calculate the height of the content let contentHeight = geo.size.height startTimer(contentHeight: contentHeight) } }) .offset(y: -scrollOffset) } } .onDisappear { stopTimer() } } private func startTimer(contentHeight: CGFloat) { timer?.invalidate() // Invalidate any existing timer timer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { _ in // Update the scroll offset withAnimation { scrollOffset += scrollSpeed } // Reset scroll offset when it reaches the end if scrollOffset >= contentHeight { scrollOffset = 0 } } } private func stopTimer() { timer?.invalidate() timer = nil } } #Preview { let config = ModelConfiguration(isStoredInMemoryOnly: true) let container = try! ModelContainer(for: OCProject.self, configurations: config) container.mainContext.insert(PreviewData.project) return AutoScrollView { Text(PreviewData.project.script) .font(.system(size: 45)) .padding(.horizontal) } }