如何在Swift 4中比较两个CGColor?

5
基本上我想做的就是比较一个layer.fillColor,它是一个CGColor,与UIColor.black.cgColor进行比较。
在Swift 4中,函数CGColorEqualToColor已经被弃用。
我尝试过:
if(layer.fillColor === UIColor.black.cgColor){
          return      
}

它仍然不起作用。我猜他们必须具有相同的kCGColorSpaceModel。

这是每个颜色在日志中的输出。

<CGColor 0x1c02a15c0> [<CGColorSpace 0x1c02a0a20> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1; extended range)] ( 0 0 0 1 )
<CGColor 0x1c008e290> [<CGColorSpace 0x1c02a0f60> (kCGColorSpaceICCBased; kCGColorSpaceModelMonochrome; Generic Gray Gamma 2.2 Profile; extended range)] ( 0 1 )

有什么解决方案吗?


实现一种颜色差异度量。如果你限制自己使用RGB或sRGB,那么它就非常简单。 - Code Different
CGColorEqualToColor== 存在相同的问题,即它检查颜色空间,因此如果它不被弃用,它也无法解决问题。 - JeremyP
4个回答

2
extension CGColor {
    func same(as another: CGColor) -> Bool {
        let components = components ?? []
        let anotherComponents = another.components ?? []
        return zip(components, anotherComponents).allSatisfy { abs($0 - $1) < 1e-4 }
    }
}

您可以将它用作如下: let sameBorderColor: Bool = borderColor.isSame(as: testBorderColor)

2

CGColor有一个方法converted(to:intent:options:)

因此,您可以编写以下方法:

extension CGColor
{
    func compareConvertingColorSpace(other: CGColor) -> Bool 
    {
        let approximateColor = other.converted(to: self.colorSpace! intent: .defaultIntent, options nil) // fatal errror with no color space
        return self == approximateColor 
    }
}

1
这是一个针对CGColor的扩展,用于检查给定的颜色是否为黑色。它适用于RGB和灰度颜色空间中的颜色。
extension CGColor {
    func isBlack() -> Bool {
        let count = numberOfComponents
        if count > 1 {
            if let components = components {
                for c in 0..<components.count-1 { // skip the alpha component
                    // All components are 0 for black
                    if components[c] != 0.0 {
                        return false
                    }
                }

                return true
            }
        }

        return false
    }
}

print(UIColor.black.cgColor.isBlack())
print(UIColor(red: 0, green: 0, blue: 0, alpha: 1).cgColor.isBlack())

您可以将此用作:

if layer.fillColor.isBlack() {
    return
}

0

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