40 lines
1.2 KiB
Swift
40 lines
1.2 KiB
Swift
//
|
|
// Swiftfin is subject to the terms of the Mozilla Public
|
|
// License, v2.0. If a copy of the MPL was not distributed with this
|
|
// file, you can obtain one at https://mozilla.org/MPL/2.0/.
|
|
//
|
|
// Copyright (c) 2024 Jellyfin & Jellyfin Contributors
|
|
//
|
|
|
|
import SwiftUI
|
|
import SwiftUIIntrospect
|
|
|
|
struct ScrollViewOffsetModifier: ViewModifier {
|
|
|
|
@StateObject
|
|
private var scrollViewDelegate: ScrollViewDelegate
|
|
|
|
init(scrollViewOffset: Binding<CGFloat>) {
|
|
self._scrollViewDelegate = StateObject(wrappedValue: ScrollViewDelegate(scrollViewOffset: scrollViewOffset))
|
|
}
|
|
|
|
func body(content: Content) -> some View {
|
|
content.introspect(.scrollView, on: .iOS(.v15), .iOS(.v16), .iOS(.v17), .tvOS(.v15), .tvOS(.v16), .tvOS(.v17)) { scrollView in
|
|
scrollView.delegate = scrollViewDelegate
|
|
}
|
|
}
|
|
|
|
private class ScrollViewDelegate: NSObject, ObservableObject, UIScrollViewDelegate {
|
|
|
|
let scrollViewOffset: Binding<CGFloat>
|
|
|
|
init(scrollViewOffset: Binding<CGFloat>) {
|
|
self.scrollViewOffset = scrollViewOffset
|
|
}
|
|
|
|
func scrollViewDidScroll(_ scrollView: UIScrollView) {
|
|
scrollViewOffset.wrappedValue = scrollView.contentOffset.y
|
|
}
|
|
}
|
|
}
|