如何在 SwiftUI Picker 中创建老虎机隐喻?

How to create slot-machine metaphor in SwiftUI Picker?

是否可以使用 swiftUI 创建一个老虎机来显示两组值?

在 UIKit 中,UIPickerView 提供了在选择器视图中包含多个组件的选项。 SwiftUI 的 Picker 没有。但是,您可以在 HStack 中使用多个 Picker。在某些情况下,透视图可能看起来与具有多个组件的 UIPickerView 略有不同,但对我来说它看起来完全可以接受。

这是一个老虎机示例,有 4 个并排的选择器和一个按钮,点击时 "spins" 老虎机(请注意,我禁用了选择器上的用户交互,因此只能使用按钮):

enum Suit: String {
    case heart, club, spade, diamond

    var displayImage: Image {
        return Image(systemName: "suit.\(self.rawValue).fill")
    }
}
struct ContentView: View {
    @State private var suits: [Suit] = [.heart, .club, .spade, .diamond]
    @State private var selectedSuits: [Suit] = [.heart, .heart, .heart, .heart]

    var body: some View {
        VStack {
            HStack(spacing: 0) {
                ForEach(0..<self.selectedSuits.count, id: \.self) { index in
                    Picker("Suits", selection: self.$selectedSuits[index]) {
                        ForEach(self.suits, id: \.self) { suit in
                            suit.displayImage
                        }
                    }
                    .frame(minWidth: 0, maxWidth: .infinity)
                    .clipped()
                    .disabled(true)
                }
            }
            Button(action: self.spin) {
                Text("Spin")
            }
        }
    }

    private func spin() {
        self.selectedSuits = self.selectedSuits.map { _ in
            self.suits.randomElement()!
        }
    }
}

这只是一个例子,毫无疑问可以改进,但它是一个不错的起点。

请记住,此代码确实会在 Xcode Beta 5 中引发警告 -

'subscript(_:)' is deprecated: See Release Notes for migration path.

我还没有机会研究这个,但这个例子仍然有效,应该可以帮助您实现您想要实现的目标。