как сравнить два CGColor в Swift 4

По сути, все, что я хочу сделать, это сравнить layer.fillColor, который является CGColor, с UIColor.black.cgColor.

Функция CGColorEqualToColor теперь устарела в Swift 4.

Я пытался:

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 )

Какое решение?


person Tarek hemdan    schedule 03.01.2018    source источник
comment
Внедрите меру цветового различия. Если вы ограничитесь RGB или sRGB, это довольно просто   -  person Code Different    schedule 03.01.2018
comment
CGColorEqualToColor имеет ту же проблему, что и ==, в том, что он проверяет цветовое пространство, так что это не помогло бы, если бы не было объявлено устаревшим.   -  person JeremyP    schedule 03.01.2018


Ответы (3)


Вот расширение для 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
}
person rmaddy    schedule 03.01.2018

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 
    }
}
person JeremyP    schedule 03.01.2018

Я бы предложил преобразовать 2 цвета в строки, а затем сравнить их в обычном режиме. Чтобы преобразовать их в строки, для этого есть ответ https://stackoverflow.com/a/14051861/3342901.

person Ashraf Tawfeeq    schedule 03.01.2018