3/// Defers the rendering of a view for the given period.
8/// Text("Hello, world!")
9/// .deferredRendering(for: .seconds(5))
12/// will not display the text "Hello, world!" until five seconds after the
13/// view is initially rendered. If the view is destroyed within the delay,
16/// This is based on code xwritten by Yonat and Charlton Provatas on
17/// Stack Overflow, see https://stackoverflow.com/a/74765430/1558022
19private struct DeferredViewModifier: ViewModifier {
20 let delay: DispatchTimeInterval
22 func body(content: Content) -> some View {
25 DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
26 self.shouldRender = true
32 private func _content(_ content: Content) -> some View {
40 @State private var shouldRender = false
44 func deferredRendering(for delay: DispatchTimeInterval) -> some View {
45 modifier(DeferredViewModifier(delay: delay))
49struct DeferredRendering_Previews: PreviewProvider {
50 static var previews: some View {
52 Text("This text renders immediately")
53 Text("This text appears after a delay")
54 .deferredRendering(for: .seconds(1))