首页 > 解决方案 > 如何根据背景图像的颜色更改 UILabel 文本颜色?(iOS)

问题描述

我想根据背景图像的颜色更改 UILabel 的文本颜色。例如,当存在深色背景图像时,将 UILabel 文本颜色的颜色更改为白色,反之亦然。

标签: iosswiftxcodeimageuilabel

解决方案


这是一种方法 - 这不是我的工作......我在https://gist.github.com/adamcichy/2d00c7a54009b4a9751ba513749c485e找到它(在这里重新发布,因为链接将来可能会失败):

extension CGImage {
    var isDark: Bool {
        get {
            guard let imageData = self.dataProvider?.data else { return false }
            guard let ptr = CFDataGetBytePtr(imageData) else { return false }
            let length = CFDataGetLength(imageData)
            let threshold = Int(Double(self.width * self.height) * 0.45)
            var darkPixels = 0
            for i in stride(from: 0, to: length, by: 4) {
                let r = ptr[i]
                let g = ptr[i + 1]
                let b = ptr[i + 2]
                let luminance = (0.299 * Double(r) + 0.587 * Double(g) + 0.114 * Double(b))
                if luminance < 150 {
                    darkPixels += 1
                    if darkPixels > threshold {
                        return true
                    }
                }
            }
            return false
        }
    }
}

extension UIImage {
    var isDark: Bool {
        get {
            return self.cgImage?.isDark ?? false
        }
    }
}

然后你可以使用(例如):

    // default to false (meaning, the image is not dark)
    let b = myImageView.image?.isDark ?? false

    if b {
        // use a light-color for textColor
    } else {
        // use a dark-color for textColor
    }

但这并不是那么简单……您的图像可能有明暗区域,因此您只想计算标签后面的图像区域。但这是一个很好的起点。

编辑:正如 rmaddy 评论的那样,这可能不会给你想要的结果。图像,尤其是照片,具有不同的明暗像素/区域。例如,您可能在明亮的天空中有一座黑暗的建筑物 --- 如果标签从建筑物开始并在天空结束,则检查边界矩形的“黑暗”对您没有多大帮助。

一种替代方法是在文本后面使用带有深色、半透明矩形(圆角、软边缘)的白色文本。


推荐阅读