如何用SwiftUI制作具有绝对位置的底栏

如何用SwiftUI制作具有绝对位置的底栏,swiftui,Swiftui,嗨,我是SwiftUI的新手,有个问题 我想制作一个可在多个视图中使用的底部栏(可重用模块) 但由于它的兄弟视图,它在每个视图中的位置都不同 以下是我尝试过的: 几何导引头 但每个视图的几何体都不同 覆盖和位置(x:y:) 这也不起作用 ZStack 我的问题是 如何制作固定位置视图?(类似位置:css中的绝对位置) 这个问题的正常解决方案是什么 有没有关于SwiftUI的有用参考资料 我想使用这个模块作为底部按钮栏 struct BaseBottomButton: View { let

嗨,我是SwiftUI的新手,有个问题

我想制作一个可在多个视图中使用的底部栏(可重用模块)

但由于它的兄弟视图,它在每个视图中的位置都不同

以下是我尝试过的:

  • 几何导引头 但每个视图的几何体都不同
  • 覆盖和位置(x:y:) 这也不起作用
  • ZStack
  • 我的问题是

  • 如何制作固定位置视图?(类似位置:css中的绝对位置)
  • 这个问题的正常解决方案是什么
  • 有没有关于SwiftUI的有用参考资料
  • 我想使用这个模块作为底部按钮栏

    struct BaseBottomButton: View {
        let screen = UIScreen.main.bounds
        
        var body: some View {
            Button(action: {
                print("hello")
            }) {
                Text("Hello")
            }
            .frame(width: self.screen.width ,height: 40)
            .background(Color.red)
        }
    }
    
    从这个角度来看,它是有效的

    但在这个复杂的视图中,它不起作用


    这不是问题的答案

    如何制作固定位置视图?(类似位置:css中的绝对位置

    但是你可以先用这样的东西:

    VStack(spacing: 0) {
         Spacer()
         Button(action: {
             print("button clicked")
         }) {
             Text("MY BUTTON")
         }
    }
    
    VStack(spacing: 0) {
         SomeView()
         Spacer()
         Button(action: {
             print("button clicked")
         }) {
             Text("MY BUTTON")
         }
    }
    
    这将在屏幕底部显示一个按钮。如果希望视图显示在屏幕的顶部,只需将其放置在垫片之前,如下所示:

    VStack(spacing: 0) {
         Spacer()
         Button(action: {
             print("button clicked")
         }) {
             Text("MY BUTTON")
         }
    }
    
    VStack(spacing: 0) {
         SomeView()
         Spacer()
         Button(action: {
             print("button clicked")
         }) {
             Text("MY BUTTON")
         }
    }
    
    最后,如果视图在垂直方向上太大,只需将其放在滚动视图中(但不要将按钮放在其中)。因此,您将实现一种效果,即按钮始终显示在底部和前部,并且视图可在其后面滚动

    如果您复制并粘贴我的简单示例的以下最终代码,您将看到这种效果,并将快速了解其工作原理以及如何将其应用于您的场景:

    VStack(spacing: 0) {
        ScrollView(.vertical, showsIndicators: false) {
           Text("some text").font(.system(size: 60)).padding()
           Text("some text").font(.system(size: 60)).padding()
           Text("some text").font(.system(size: 60)).padding()
           Text("some text").font(.system(size: 60)).padding()
           Text("some text").font(.system(size: 60)).padding()
           Text("some text").font(.system(size: 60)).padding()
           Text("some text").font(.system(size: 60)).padding()
           Text("some text").font(.system(size: 60)).padding()
           Text("some text").font(.system(size: 60)).padding()
        }
        Spacer()
        Button(action: {
           print("button clicked")
        }) {
           Text("MY BUTTON")
        }
    }
    

    您需要显式视图容器来管理底部栏,如

    struct BottomBarContainer<Content: View>: View {
        let content: () -> Content
    
        init(@ViewBuilder _ content: @escaping () -> Content) {
            self.content = content
        }
    
        var body: some View {
            VStack {
                content()
                Spacer() // << always pushes below bar to bottom
                BaseBottomButton() // or any bar container here
            }
        }
    }
    

    你愿意添加你的代码吗?@Asperi我添加了我的示例代码和图像谢谢!!!!!我解决了我的问题,还学习了它是如何工作的+加号)。edgesIgnoringSafeArea(.vertical)这也是我的解决方案
    BottomBarContainer {
       NewView()
    }