macos - SwiftUI 列表选中行文本颜色

标签 macos swiftui

我有一个 macOS SwiftUI 应用程序,它有一个使用 NavigationView 创建的主从 Split View,左栏是一个列表,右侧是详细 View 。列表内容行是 NavigationLink,其中嵌入了带有几个 Text 元素的自定义 View 。

有什么方法可以更改选定行的文本颜色吗?我在 macOS 上使用粉红色高亮颜色,并且(当使用浅色外观时)SwiftUI 知道在突出显示时将某些控件中的文本更改为白色(至少是分段选择器。)但我不知道如何在我的列表行,无论行的背景颜色如何,.foregroundColor(Color.primary) 都将文本保持为黑色。

这是在 macOS 10.15.2 上运行的 Xcode 11.2.1。

最佳答案

可访问的颜色

我在 Apple SwiftUI 中找到了这个 tutorial .它是 Color 的扩展,并返回白色或黑色,以在背景颜色上更容易访问的那个为准:

extension Color: Codable {
    var accessibleFontColor: Color {
        var red: CGFloat = 0
        var green: CGFloat = 0
        var blue: CGFloat = 0
        UIColor(self).getRed(&red, green: &green, blue: &blue, alpha: nil)
        return isLightColor(red: red, green: green, blue: blue) ? .black : .white
    }

    private func isLightColor(red: CGFloat, green: CGFloat, blue: CGFloat) -> Bool {
        let lightRed = red > 0.65
        let lightGreen = green > 0.65
        let lightBlue = blue > 0.65

        let lightness = [lightRed, lightGreen, lightBlue].reduce(0) { $1 ? $0 + 1 : $0 }
        return lightness >= 2
    }
}

你可以像这样使用它,例如:

[...]
MyRowView()
    .background(backgroundColor)
    .foregroundColor(backgroundColor.accessibleFontColor)

关于macos - SwiftUI 列表选中行文本颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59343348/

相关文章:

ruby-on-rails - 在 MAC 上更新 ruby​​ 版本

python - 错误 : Could not find a version that satisfies the requirement webdriver (from versions: )

node.js - -bash : grunt: command not found

objective-c - 在 Swift 中使用命令行工具更新当前行

swift - 理解 UIViewRepresentable

objective-c - 适用于 iOS 和 Mac OS X 的 MacBinary 转换器

swift - 在 SwiftUI 中制作宽度和高度相同的按钮网格

ios - SwiftUI:动画期间的文本问题

swift - TabView 上的元素删除后不消失

ios - 如何在 SwiftUI 中实现协议(protocol)和委托(delegate)