【问题标题】:What is causing SwiftUI's Picker to swallow the stars on macOS?是什么导致 SwiftUI 的 Picker 在 macOS 上吞星?
【发布时间】: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() )但这并不能回答为什么将这些视图放在选择器中的问题混乱的观点。

标签: macos swiftui picker


【解决方案1】:

Picker 对于不同的表单有不同的允许 View 泛型。不透明度在菜单中不起作用。只需将您的图像放在字符串连接中,或者使用从 SFSymbols 复制的文字星构建一个字符串。

【讨论】:

  • 这就解释了。您知道我在哪里可以找到有关哪些视图起作用以及如何用于各种类型的选择器样式的信息吗?
  • 是的,有时事物接受标签,但只使用图像或文本(即在工具栏中)。 Apple 设置了这个漂亮的文档系统,您可以在其中自行测试。就是这样。
猜你喜欢
  • 2020-02-22
  • 2021-10-20
  • 2020-02-29
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 2011-04-02
  • 2020-05-18
  • 2022-01-08
相关资源
最近更新 更多