SwiftUI 显示延迟的自定义视图

Lin*_*a_F 0 delay swiftui

我有这样的东西在我的ZStack

if hidePopup {
      CustomButton()
      .hidden()
 } else if stateManager.isBtnClosePressed {
      CustomButton()
      .hidden()
 } else {
      CustomButton()
 }
Run Code Online (Sandbox Code Playgroud)

我需要在最后一个 else 显示CustomButton()一些延迟。我试过把它包起来,DispatchQueue.main.async但它不适合那里。我的意思是:

DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {
      CustomButton()
 } 
Run Code Online (Sandbox Code Playgroud)

TIA 提供您的意见和帮助

Yon*_*nat 7

您需要@State在延迟后更改var。例如:

struct ContentView: View {
    @State var isButtonHidden = true
    let button = Button("Custom", action: {})

    var body: some View {
        Group {
            if isButtonHidden {
                button.hidden()
            } else {
                button
            }
        }
        .onAppear {
            DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {
                self.isButtonHidden = false
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Cha*_*tas 5

添加到@Yonat\'s answer\xe2\x80\x93 您可以使用它作为视图修饰符

\n
/// A ViewModifier that defers its rendering until after the provided threshold surpasses\nprivate struct DeferredViewModifier: ViewModifier {\n\n    // MARK: API\n\n    let threshold: Double\n\n    // MARK: - ViewModifier\n\n    func body(content: Content) -> some View {\n        _content(content)\n            .onAppear {\n               DispatchQueue.main.asyncAfter(deadline: .now() + threshold) {\n                   self.shouldRender = true\n               }\n            }\n    }\n\n    // MARK: - Private\n\n    @ViewBuilder\n    private func _content(_ content: Content) -> some View {\n        if shouldRender {\n            content\n        } else {\n            content\n                .hidden()\n        }\n    }\n\n    @State\n    private var shouldRender = false\n}\n\nextension View {\n    func deferredRendering(for seconds: Double) -> some View {\n        modifier(DeferredViewModifier(threshold: seconds))\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

用法:

\n
struct MyView: View {\n    var body: some View {\n        Text("test")\n           .deferredRendering(for: 0.5)\n    } \n}\n
Run Code Online (Sandbox Code Playgroud)\n