首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI:更改ZStack .zIndex顺序

SwiftUI:更改ZStack .zIndex顺序
EN

Stack Overflow用户
提问于 2019-11-27 18:18:01
回答 2查看 5.8K关注 0票数 2

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

我所做的:设置一个州“当点击绿色,绿色是ZStack的顶层)。

结果:不起作用:当点击绿色,它就会变成绿色。但我点击蓝色,它就会保持绿色。这个逻辑绝对不正确

代码语言:javascript
复制
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)")
    }
}

问:我如何正确地设置一个Z堆栈来显示所选的层?不必使用ZIndex,可以是.hide()修饰符,也可以是其他逻辑。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-27 18:39:51

除了BOOL之外,您还需要从单击的按钮中切换其他BOOLs。

下面的工作,虽然可能有一个更优雅的方式来做。将按钮部分替换为:

代码语言:javascript
复制
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中,元素相互堆叠在一起。第一项是最底层,各层互相叠在一起。

在您的版本中,当您单击“黄色”、“蓝色”和“绿色”时,可能仍然会“叠加”黄色层,因此您需要确保移除其他层。

票数 4
EN

Stack Overflow用户

发布于 2019-11-27 23:46:01

在我看来,如果您有几个Bool值,其中只有一个在任何时候都是真的,那么使用枚举来表示选项要容易得多--管理状态也要容易得多。这就是您所期望的行为:

代码语言:javascript
复制
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())
    }
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59076305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档