所有视图的 SwiftUI 视图,包括工作表视图

Posted

技术标签:

【中文标题】所有视图的 SwiftUI 视图,包括工作表视图【英文标题】:SwiftUI view over all the views including sheet view 【发布时间】:2021-09-02 15:03:58 【问题描述】:

无论顶视图是什么,我都需要根据特定条件显示所有视图之上的视图。我正在尝试以下代码:

    struct TestView<Presenting>: View where Presenting: View 
    
        /// The binding that decides the appropriate drawing in the body.
        @Binding var isShowing: Bool
        /// The view that will be "presenting" this notification
        let presenting: () -> Presenting
    
        var body: some View 
    
            GeometryReader  geometry in
                ZStack(alignment: .top) 
                    self.presenting()
    
                    HStack(alignment: .center) 
                        Text("Test")
                    
                    .frame(width: geometry.size.width - 44,
                           height: 58)
                    .background(Color.gray.opacity(0.7))
                    .foregroundColor(Color.white)
                    .cornerRadius(20)
                    .transition(.slide)
                    .opacity(self.isShowing ? 1 : 0)
                
            
        
    

extension View 
    func showTopView(isShowing: Binding<Bool>) -> some View 
        TestView(isShowing: isShowing,
                               presenting:  self )
        


struct ContentView: View 
   @State var showTopView = false
   NavigationView 
            ZStack 
                content
            
        
        .showTopView(isShowing: $showTopView)


现在,如果视图被推送,这可以正常工作。但我无法在呈现的视图上方显示此 TopView。

感谢任何帮助!

【问题讨论】:

这是否回答了您的问题***.com/a/63259094/12299030? 不,它不是@Asperi。我需要一个视图显示在顶部,而不考虑当前的顶视图是什么,是呈现或推送的顶视图等。这就像在所有视图的顶部显示一个加载器。 【参考方案1】:

这里有一种方法可以实现你的目标,你不需要Binding,只需要使用let value。

struct ContentView: View 
    
    @State private var isShowing: Bool = Bool()
    
    var body: some View 
        
        CustomView(isShowing: isShowing, content:  yourContent , isShowingContent:  isShowingContent )
        
    
    
    var yourContent: some View 
        
        NavigationView 
            
            VStack(spacing: 20.0) 
                
                Text("Hello, World!")
                
                Button("Show isShowing Content")  isShowing = true 
                
            
            .navigationTitle("My App")
            
        
        
    
    
    var isShowingContent: some View 
        
        ZStack 
            
            Color.black.opacity(0.5).ignoresSafeArea()
            
            VStack 
                
                Spacer()
                
                Button("Close isShowing Content")  isShowing = false 
                    .foregroundColor(.white)
                    .padding()
                    .frame(maxWidth: .infinity)
                    .background(Color.blue.cornerRadius(10.0))
                    .padding()
                
            
            
        
        
    
    


struct CustomView<Content: View, IsShowingContent: View>: View 
    
    let isShowing: Bool
    @ViewBuilder let content: () -> Content
    @ViewBuilder let isShowingContent: () -> IsShowingContent
    
    var body: some View 
        
        Group 
            
            if isShowing  ZStack  content().blur(radius: isShowing ? 5.0 : 0.0); isShowingContent()  
            else  content() 
 
        
        .animation(.default, value: isShowing)
        
    

【讨论】:

在呈现视图的情况下它不起作用。呈现的视图上方没有显示任何内容。 是的,我试过你的代码。请尝试使用工作表呈现某些内容,您会发现自定义视图永远不会显示在工作表上方。 ***.com/questions/59277120/… 这是我想要回答的问题 有了我的答案,你不需要使用表!我的代码是工作表!

以上是关于所有视图的 SwiftUI 视图,包括工作表视图的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 4.0 中原生图表(Charts)实现超长内容滚动功能

SwiftUI 4.0 中原生图表(Charts)实现超长内容滚动功能

3.复杂查询

SwiftUI之深入解析如何定制视图的动画和转场

如何让 SwiftUI Picker 在子视图中工作? (变灰)

包括基于平台的 SwiftUI 视图修饰符