在ScrollView中切换VStack的饱和度-SwiftUI

时间:2020-10-20 21:41:00

标签: ios swift swiftui

我有一个ScrollView,其中包含一个VStacks按钮数组。 VStack数据是从名为ProductModel的数据模型填充的。我还从另一个视图通过ObservableObject,这里是:(注意:此数据字符串确实发生了变化,因此并不总是All。也是ProductModel之一ScrollView中将始终匹配要匹配的数据)。

class selectedApplication: ObservableObject {
      @Published var selectedApplication = "All"
}

我想要做的是将所有与传递的数据字符串不匹配的行涂成灰色,并仅将匹配的VStack涂成彩色。之后,如果按下了其他按钮,则该VStack变为彩色,其他所有按钮变为/保持灰色。我尝试通过@State并使用切换键来更改饱和度,但是没有运气。因此,关于如何解决此问题的任何方向将不胜感激!谢谢

这是VStack的视图:

struct ProductTab5View: View {
    
    @ObservedObject var application: selectedApplication
    @State private var selection: Bool? = true
    var product: ProductModel
    
    var body: some View {
            ScrollView(.horizontal){
                HStack
                    ForEach(product.application, id: \.self) { item in
                            Button(action: {
                                application.selectedApplication = item
                                selection = false
                            }) {
                                VStack{
                                    Image(item)
                                    Text(item)
                                }
                                .saturation(selection ?? true ? 0.0 : 1.0)
                            }
                    }
            }
    }
}

1 个答案:

答案 0 :(得分:2)

不需要额外的@State变量。您可以尝试以下操作:

struct ProductTab5View: View {
    @ObservedObject var application: selectedApplication
    var product: ProductModel

    var body: some View {
        ScrollView(.horizontal) {
            HStack
            ForEach(product.application, id: \.self) { item in
                Button(action: {
                    application.selectedApplication = item
                }) {
                    VStack {
                        Image(item)
                        Text(item)
                    }
                    .saturation(application.selectedApplication == item ? 1.0 : 0.1)
                }
            }
        }
    }
}