jellyflood/Shared/Extensions/ViewExtensions/Modifiers/ScrollViewOffsetModifier.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
}
}
}