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.
68 lines
1.7 KiB
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))
|
|
}
|
|
}
|
|
|