You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
PadelClub/PadelClub/Views/ViewModifiers/DeferredViewModifier.swift

68 lines
1.7 KiB

//
// DeferredViewModifier.swift
// PadelClub
//
// Created by Razmig Sarkissian on 02/03/2024.
//
import SwiftUI
/// Defers the rendering of a view for the given period.
///
/// For example:
///
/// ```swift
/// Text("Hello, world!")
/// .deferredRendering(for: .seconds(5))
/// ```
///
/// will not display the text "Hello, world!" until five seconds after the
/// view is initially rendered. If the view is destroyed within the delay,
/// it never renders.
///
/// This is based on code xwritten by Yonat and Charlton Provatas on
/// Stack Overflow, see https://stackoverflow.com/a/74765430/1558022
///
private struct DeferredViewModifier: ViewModifier {
let delay: DispatchTimeInterval
func body(content: Content) -> some View {
_content(content)
.onAppear {
DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
self.shouldHide = true
}
}
}
@ViewBuilder
private func _content(_ content: Content) -> some View {
if shouldHide == false {
content
} else {
content.hidden()
}
}
@State private var shouldHide = false
}
extension View {
func toastFormatted() -> some View {
self
.font(.title3)
.frame(height: 28)
.padding()
.background {
RoundedRectangle(cornerRadius: 20, style: .continuous)
.fill(.white)
}
.shadow(radius: 2)
.offset(y: -64)
}
func deferredRendering(for delay: DispatchTimeInterval) -> some View {
modifier(DeferredViewModifier(delay: delay))
}
}