【发布时间】:2021-07-30 04:16:48
【问题描述】:
我在 macOS 上有一个 SwiftUI 视图,它使用 HStack 中的 5 个系统映像显示 5 星评级。当我将此视图作为可选内容放入Picker 时,仅显示五颗星中的第一颗。是什么导致了这种行为?自定义颜色也会被忽略。
这是评分视图:
struct RatingView: View {
var rating: Int
var body: some View {
HStack(spacing: 0) {
ForEach(0..<5, id: \.self) { pos in
let isFull = (pos < rating)
Image(systemName: isFull ? "star.fill" : "star")
.opacity(isFull ? 1.0 : 0.2)
}
}
}
}
这里是选择器视图(有一个本地选择只是为了试验):
struct RatingFilter: View {
@State var selection = "B"
var body: some View {
Picker("", selection: $selection) {
RatingView(rating: 0)
.frame(width: 100)
.tag("A")
RatingView(rating: 1)
.foregroundColor(.red)
.frame(width: 100)
.tag("B")
}
.labelsHidden()
}
}
这是一个简单的 ContentView 我正在尝试它(RatingFilter 视图存在两次,因此您可以在屏幕截图中看到它有和没有它的菜单)
var body: some View {
VStack(spacing: 50) {
RatingView(rating: 1)
RatingFilter()
.frame(width: 150)
RatingFilter()
.frame(width: 150)
}
.frame(width: 300, height: 300)
}
结果:
我也尝试在选择器中使用图像硬编码HStack,但我得到了相同的结果:
Picker("", selection: $selection) {
HStack(spacing: 0) {
Image(systemName: "star.fill")
Image(systemName: "star.fill")
Image(systemName: "star.fill")
}
.tag("B")
}
最后,我将选择器样式设置为 InlinePickerStyle() 我得到内联单选按钮,所有星星都显示,第二项显示红色(它有效,但该样式对我不可用),如果我设置它到SegmentedPickerStyle() 它“扁平化”HStack 并给我 10 个单独的星星可供选择(而不是两组 5 个)。狂野!
【问题讨论】:
-
对此我有两个想法。首先,放弃选择器并遵循本教程:来自 Paul Hudson 的Adding a custom star rating component。另一种是,如果您与选择器结婚,请将您的星级评分放入一个枚举中,并使用该枚举来填充选择器。你最终想要的是一个数字,而不是星星的数量。数字决定了星星,或者您选择使用的任何图像。
-
感谢您的建议。问题是,我真的很想知道为什么这不起作用——为什么只有一张图像出现在选择器中。这告诉我有更深层次的东西我不明白,我很想了解它。我有一个解决方法可以让我现在继续(起初我做了一个像你提到的那样的枚举,现在我在弹出窗口中使用 InlinePickerStyle() )但这并不能回答为什么将这些视图放在选择器中的问题混乱的观点。