SwiftUI 如何获取文本/视图下的背景颜色,以便反转前景色

问题描述 投票:0回答:1

一直在尝试找到一种解决方案来动态检测背景颜色/要修改的视图下方的颜色,因为我可能希望在图像上有可读的文本,而不需要使用图像的平均颜色来确定正确的颜色对于文本,因为某些图像在图像中的某些位置可能有更多的浅色,反之亦然,对于深色,所以有没有办法获取某个坐标处的颜色,然后用它来确定文本颜色应该是什么,尝试过使用 Grok 等生成一个基础到目前为止,但 GeomertyReader 中没有 Color 函数,因为它希望我使用 Grok 的响应

struct BackgroundColorKey: PreferenceKey {
    static var defaultValue: Color? = nil
    
    static func reduce(value: inout Color?, nextValue: () -> Color?) {
        value = nextValue()
    }
}

struct BackgroundColorReader: View {
    var body: some View {
        GeometryReader { geometry in
            Color.clear
                .preference(key: BackgroundColorKey.self, value: geometry.color(at: geometry.frame(in: .local).center))
        }
    }
}

struct DynamicTextColor: View {
    @State private var backgroundColor: Color? = nil
    
    var body: some View {
        VStack {
            Text("Your Text Here")
                .foregroundColor(backgroundColor?.luminance < 0.5 ? .white : .black) // Invert based on luminance
                .background(
                    BackgroundColorReader()
                        .onPreferenceChange(BackgroundColorKey.self) { newColor in
                            self.backgroundColor = newColor
                        }
                )
        }
    }
}

这就是它生成的代码,如果其他人没有解决方案,也可以在网上无休止地查找,那么是否有一个框架或解决方案可以同时用于 macOS 和 iOS。

这是我试图在下面的 SwiftUI 中解决的一个示例

This is an Example I'm trying to solve in SwiftUI

ios swift macos swiftui background-color
1个回答
0
投票

试试这个:

ZStack {
    wallpaper

    ZStack {
        text.foregroundColor(.white)
            .blendMode(.difference)
            .overlay(text.blendMode(.hue))
            .overlay(text.foregroundColor(.white).blendMode(.overlay))
            .overlay(text.foregroundColor(.black).blendMode(.overlay))
    }
}

代码取自:https://designcode.io/swiftui-handbook-multiple-blending-modes

© www.soinside.com 2019 - 2024. All rights reserved.