比较两个UIColor对象

3
这个问题可能已经被问过了,但我找不到合适的参考资料。我找到了这个问题,但那是将三个数字相互比较。
我试图比较2个UIColor以避免重复。每个颜色都引用了r、g、b、alpha。我形成颜色,以便可以控制数字格式。
应该如何处理这个问题?
非常感谢您的帮助。

你想知道两种颜色是否相同吗? - Luca Angeletti
1
@appzYourLife,@fpg1503 如果我没记错的话,UIColorEquatable - user28434'mstep
1
是的,但是 Equatable 实现并没有考虑到不同方式创建的颜色(不同的颜色空间)。 - fpg1503
@fpg1503,是的,为了保持简单,我只想比较r、g、b、a值。 - ICL1901
请问你们能详细说明如何使用相等性吗?你是指 red1 == red2,green1 == green2 等吗? - ICL1901
显示剩余3条评论
2个回答

5

如果您以相同的方式创建所有颜色,只需使用==

如果您的颜色位于不同的颜色空间中,并且只想比较它们的RGBA值,请使用以下内容:

extension UIColor {
    func equals(_ rhs: UIColor) -> Bool {
        var lhsR: CGFloat = 0
        var lhsG: CGFloat = 0
        var lhsB: CGFloat = 0
        var lhsA: CGFloat = 0
        self.getRed(&lhsR, green: &lhsG, blue: &lhsB, alpha: &lhsA)

        var rhsR: CGFloat = 0
        var rhsG: CGFloat = 0
        var rhsB: CGFloat = 0
        var rhsA: CGFloat = 0
        rhs.getRed(&rhsR, green: &rhsG, blue: &rhsB, alpha: &rhsA)

        return  lhsR == rhsR &&
                lhsG == rhsG &&
                lhsB == rhsB &&
                lhsA == rhsA
    }
}

例如:
let white1 = UIColor.white
let white2 = UIColor(colorLiteralRed: 1, green: 1, blue: 1, alpha: 1)
white1 == white2 //false
white1.cgColor == white2.cgColor //false
white1.equals(white2) //true

0
如果您将其初始化为UIColor,则应该能够轻松地将颜色相互比较:
import UIKit

let myFirstColor = UIColor.red
let mySecondColor = UIColor.red
let myThirdColor = UIColor(colorLiteralRed: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)
let iosWhite = UIColor.white
let myWhite = UIColor(white: 1.0, alpha: 1.0)

myFirstColor == mySecondColor //True
myFirstColor == myThirdColor //True
iosWhite == myWhite // True

从评论中,存在一些边缘情况。我认为这些都是灰色黑色白色透明。为了弥补这个问题,你可以创建自己的灰色并与之比较:

let myOtherWhite = UIColor(colorLiteralRed: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)

这意味着它不等于UIColor.white

也就是说,在playground中很容易找到边缘情况: enter image description here


1
无法使用UIColor.whiteUIColor(colorLiteralRed: 1, green: 1, blue: 1, alpha: 1) - fpg1503
在Playground中尝试一下。白色只有w:1.0和a:1.0。 - Idan
1
确切地说,它们是不同方式创建的,这就是为什么它是一个适当的边缘情况。 - fpg1503
2
另一个更好!希望我的能够帮助更好地理解,所以我将它留在这里。干杯! - Idan
2
@AppzYourLife,你为什么删除了你的回答?它看起来很有前途...还有感谢你的编辑。它完美地聚焦了我的问题。 - ICL1901
1
我实际上想到了一个更简单的方法——不是百分之百可靠,但对我的目的来说足够好了:将r、g、b、a的值相加。限制在五到六位小数。我得到了很好的结果。 - ICL1901

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接