【问题标题】:How to put an element in front of a ForEach with a ZStack without making it overlapped如何使用 ZStack 将元素放在 ForEach 前面而不使其重叠
【发布时间】:2025-12-22 05:35:06
【问题描述】:

我正在尝试创建一个布局,其中有一个元素列表,以及一个用于在其前面添加更多元素的按钮。我知道我可以把它放在导航栏中,但这不是我想要实现的图形外观。但是,如果我将这两个元素放在 ZStack 中,则 ForEach 会重叠,即使它位于 VStack 中。我该如何解决这个问题?

import SwiftUI

        struct ContentView: View {
        let arrayTest = ["Element 1", "Element 2", "Element 3"]
       
       var body: some View {
         NavigationView {
          ZStack {
            VStack {
                ForEach(arrayTest, id: \.self) { strings in
                    Text(strings)
                }
            }
           VStack {
           Spacer()
           HStack {
           Spacer()
            Button(action: {
              //AddView
              }) { 
                Image(systemName: "plus")
                  .background(Circle().foregroundColor(.yellow))
               }.padding(.trailing, 20)
               .padding(.bottom, 20)
             }
             }
           }
           }
          }
        }

编辑:更准确地说,我希望按钮位于 ForEach 上方,因为如果我使用 VStack 并且元素列表很长,用户必须一直滚动到底部才能找到按钮。使用 ZStack,无论用户在列表的哪个位置,它始终是可见的。

【问题讨论】:

    标签: button foreach swiftui stack zstack


    【解决方案1】:

    这是使用overlay的一种方式,请参见代码中的示例:

    struct ContentView: View {
        
        @State private var arrayTest: [String] = [String]()
        
        var body: some View {
            
            NavigationView {
                
                Form { ForEach(arrayTest, id: \.self) { strings in Text(strings) } }
                    .navigationTitle("Add Elements")
                
            }
            .overlay(
                
                Button(action: { addElement() })
                    { Image(systemName: "plus").font(Font.largeTitle).background(Circle().foregroundColor(.yellow)) }.padding()
                
                , alignment: .bottomTrailing)
            .onAppear() { for _ in 0...12 { addElement() } }
            
        }
        
        func addElement() { arrayTest.append("Element " + "\(arrayTest.count + 1)") }
        
    }
    

    【讨论】:

    • 谢谢!使用叠加层,我可以将按钮放置在我想要的位置!现在我要弄清楚当我进入DetailView时如何隐藏它,一步一步我继续前进!
    • 我想我做到了!我使用了 Binding 和 State Bool,以及 if 来隐藏/显示它!但是非常感谢你