gloss-ios/VisibilityTrackingScrollVie...

36 lines
1.1 KiB
Swift
Raw Permalink Normal View History

2023-03-11 20:31:48 -08:00
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// Created by Sam Deane on 27/07/22.
// All code (c) 2022 - present day, Elegant Chaos Limited.
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
import SwiftUI
public struct VisibilityTrackingScrollView<Content, ID>: View where Content: View, ID: Hashable {
@ViewBuilder let content: Content
@State var visibilityTracker: VisibilityTracker<ID>
public init(action: @escaping VisibilityTracker<ID>.Action, @ViewBuilder content: () -> Content) {
self.content = content()
self._visibilityTracker = .init(initialValue: VisibilityTracker<ID>(action: action))
}
public var body: some View {
ScrollView {
content
.environmentObject(visibilityTracker)
}
.background(
GeometryReader { proxy in
report(proxy: proxy)
}
)
}
func report(proxy: GeometryProxy) -> Color {
visibilityTracker.reportContainerBounds(proxy.frame(in: .global))
return Color.clear
}
}