SwiftUI:更改ZStack .zIndex顺序

时间:2019-11-27 18:18:01

标签: swiftui

目标是一个菜单,其中: 用户点击绿色按钮:显示绿色菜单 用户点击蓝色按钮:显示蓝色菜单

我做了什么: 将状态设置为“当点击绿色时,绿色是ZStack的顶层)。

结果: 没用: 当点击绿色时,变为绿色。但是然后我点击蓝色,它保持绿色。逻辑肯定是不正确的

import SwiftUI

struct Menutest: View {

    @State private var showall = false
    @State private var showgreen = false
    @State private var showyellow = false
    @State private var showblue = false


    var body: some View {


        NavigationView {

           HStack {

            Spacer()

            ZStack {
                Rectangle()
                .foregroundColor(.blue)
                //.opacity(showblue ? 1 : 0)
               .zIndex(showblue ? 1 : 0)

                Rectangle()
                .foregroundColor(.green)
                 //.opacity(showgreen ? 1 : 0)
                .zIndex(showgreen ? 1 : 0)


                Rectangle()
                .foregroundColor(.yellow)
                 //.opacity(showyellow ? 1 : 0)
                .zIndex(showyellow ? 1 : 0)



            }
            .frame(width: 400.0)
          //  .offset(x: showall ? 0 : UIScreen.main.bounds.width)
            .animation(.easeInOut)

        }





        .navigationBarItems(



            trailing:

            HStack {


            Button(action: {
              //   self.showall.toggle()
                self.showyellow.toggle()
            })
            {
            Text("Yellow")

            }



           Button(action: {
            //     self.showall.toggle()
            self.showgreen.toggle()
            })
            {
            Text("Green")

            }


          Button(action: {
               //   self.showall.toggle()
                 self.showblue.toggle()
                })
                {
                Text("Blue")


               }



             }


            )

       }
      .navigationViewStyle(StackNavigationViewStyle())



    }
}




struct Menutest_Previews: PreviewProvider {
    static var previews: some View {
        Menutest()
        .colorScheme(.dark)
        .previewDevice("iPad Pro (12.9-inch) (3rd generation)")
    }
}

enter image description here

问题:如何正确设置Zstack以显示选定的图层?不必使用ZIndex,可以是.hide()修饰符,也可以是其他一些逻辑。

2 个答案:

答案 0 :(得分:2)

除了单击BOOL之外,还需要切换其他BOOL。

以下作品,尽管可能有更优雅的方法。将按钮部分替换为:

Button(action: {
  self.showyellow = true
  self.showgreen = false
  self.showblue = false
 })
 {
  Text("Yellow")
}

Button(action: {
 self.showgreen = true
 self.showblue = false
 self.showyellow = false
})
{
 Text("Green")
}

Button(action: {
 self.showblue = true
 self.showyellow = false
 self.showgreen = false
})
{
 Text("Blue")
}
}

在ZStack中,元素彼此堆叠。第一项是最下层,并且这些层相互堆叠。

在您的版本中,当您单击“黄色”时,蓝色和绿色可能仍会堆叠在黄色层“上方”,因此您需要确保删除这些其他层。

答案 1 :(得分:2)

在我看来,如果您有几个Bool值,在任何给定时间只有一个值可以为真,那么使用枚举来表示选项会更容易-管理状态也非常容易。这具有您期望的行为:

struct Menutest: View {

    private enum Selection: String, CaseIterable {
        case blue = "Blue"
        case green = "Green"
        case yellow = "Yellow"

        static let allOptions = Array(Selection.allCases)

        func color() -> Color {
            switch self {
            case .blue:
                return .blue
            case .green:
                return .green
            case .yellow:
                return .yellow
            }
        }
    }

    @State private var showing: Selection? = nil

    var body: some View {
        NavigationView {
            HStack {
                Spacer()
                ZStack {
                    ForEach(Selection.allOptions, id: \.self) { selection in
                        Rectangle()
                            .foregroundColor(selection.color())
                            .zIndex(self.showing == selection ? 1 : 0)
                    }
                }   .frame(width: 400.0)
                    .animation(.easeInOut)
            }   .navigationBarItems(trailing:
                HStack {
                    ForEach(Selection.allOptions, id: \.self) { selection in
                        Button(action: { self.showing = selection }) {
                            Text(selection.rawValue)
                        }
                    }
                })
        }   .navigationViewStyle(StackNavigationViewStyle())
    }
}