35 lines
996 B
Swift
35 lines
996 B
Swift
|
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||
|
// Created by Sam Deane on 27/07/22.
|
||
|
// All code (c) 2022 - present day, Elegant Chaos Limited.
|
||
|
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
||
|
|
||
|
import SwiftUI
|
||
|
|
||
|
struct ContentVisibilityTrackingModifier<ID: Hashable>: ViewModifier {
|
||
|
@EnvironmentObject var visibilityTracker: VisibilityTracker<ID>
|
||
|
|
||
|
let id: ID
|
||
|
|
||
|
func body(content: Content) -> some View {
|
||
|
content
|
||
|
.id(id)
|
||
|
.background(
|
||
|
GeometryReader { proxy in
|
||
|
report(proxy: proxy)
|
||
|
}
|
||
|
)
|
||
|
}
|
||
|
|
||
|
func report(proxy: GeometryProxy) -> Color {
|
||
|
visibilityTracker.reportContentBounds(proxy.frame(in: .global), id: id)
|
||
|
return Color.clear
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public extension View {
|
||
|
func trackVisibility<ID: Hashable>(id: ID) -> some View {
|
||
|
self
|
||
|
.modifier(ContentVisibilityTrackingModifier(id: id))
|
||
|
}
|
||
|
}
|