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))
|
|
}
|
|
}
|