显示 1 秒后自动关闭模式 - swiftui

Posted

技术标签:

【中文标题】显示 1 秒后自动关闭模式 - swiftui【英文标题】:Dismiss modal automatically after 1 sec of being shown - swiftui 【发布时间】:2021-09-13 05:28:17 【问题描述】:

有没有办法在显示 1 秒后自动关闭模态(.sheet)?无需任何用户干预。

我想显示它从底部开始,1 秒,然后消失(如果可能,动画向上)

基本上我有 1 个视图显示匹配信息,然后我单击下一步或不喜欢,我想显示一个 fullScreenCover 1 秒,将我丑陋的滚动隐藏到顶部以显示下一个匹配。这是相同的视图,但在数组中显示了一个新元素

谢谢/感谢/感谢

                    ScrollViewReader ProxyReader in
                        ScrollView(.vertical, showsIndicators: false, content: 
                            
                            Group 
                                //CustomImageView(urlString: model.matches[index].imageUrl3 ?? "")
                                if model.matches[index].imageUrl3 == "" 
                                    Image(systemName: "person")
                                        .frame(width: 300, height: 300, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
                                        .aspectRatio(contentMode: .fit)
                                 else 
                                    
                                    RemoteImage(url: model.matches[index].imageUrl3!)
                                        .aspectRatio(contentMode: .fit)
                                        .frame(width: 200)
                                
                                Text(model.matches[index].bucketList)
                            .padding()
                            
                        )//scroll view
                        //to recreate the veiw from scratch
                        .id(self.scrollViewID)
                        //this is to show the rejection button
                        .overlay(
                            Button(action: 
                                //move to the next match
                                self.isPresented.toggle()
                                
                                if self.index == model.matches.count-1 
                                    //go back to first match
                                    self.index = 0
                                 else 
                                    self.index += 1
                                
                                
                                //scroll to top
                                withAnimation(.spring()) 
                                    ProxyReader.scrollTo("SCROLL_TO_TOP", anchor: .top)
                                    
                                    //how to dismiss and delay animation for 2 secs!!
                                    self.isPresented.toggle()
                                
                                
                                
                            , label: 
                                Image(systemName: "xmark.circle.fill")
                                    .font(.system(size:50, weight: .semibold))
                                    .foregroundColor(.white)
                                    .padding()
                                    .background(Color("red"))
                                    .clipShape(Circle())
                            )
                            .padding(.trailing)
                            .padding(.bottom, getSafeArea().bottom == 0 ? 12 : 0) //this is an if statement
                            //.opacity(-scrollViewOffset > 450 ? 1 : 0)
                            .animation(.easeInOut)
                            
                            //to show rejection transition
                            .fullScreenCover(isPresented: $isPresented, content: 
                                FullScreenModalView.init(
                                    DispatchQueue.main.asyncAfter(deadline: .now() + 1) 
                                        isPresented = false
                                    
                                )
                                
                            )

【问题讨论】:

将你的代码缩减为minimal reproducible example 哎呀,它去 【参考方案1】:

如果我得到您的要求,解决方案是使用DispatchQueue.main.asyncAfter()

//to show rejection transition
.fullScreenCover(isPresented: $isPresented, content: 
     FullScreenModalView.init()
        DispatchQueue.main.asyncAfter(deadline: .now() + 1) 
              isPresented = false
        

)

请注意,这可能并不完全准确,因为触发时间取决于当时操作系统的繁忙程度,但通常会非常好。此外,您通常希望在关闭模式时进行一些用户交互,因为用户可能会在您显示它的第二秒内将视线移开。

【讨论】:

以上是关于显示 1 秒后自动关闭模式 - swiftui的主要内容,如果未能解决你的问题,请参考以下文章

alert弹窗几秒后自动关闭

连接wifi后十几秒后自动断开?

Android几秒后自动关闭dialog

在 Swiftui 中如何通过旋转到横向自动关闭模态

无论光标或焦点在哪里,如何在 10 秒后关闭自动完成菜单?

SwiftUI 模式表在关闭后重新打开