我有这样的东西在我的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 提供您的意见和帮助
您需要@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)
添加到@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用法:
\nstruct 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
归档时间: |
|
查看次数: |
2167 次 |
最近记录: |