如何比较Swift中的UIColors

时间:2017-03-18 18:34:13

标签: swift colors compare equals

我正在尝试比较Swift中的不同颜色。一切都很好,直到我重新构建应用程序。相同的颜色,相同的代码,但它不起作用。

我正在为文字添加背景颜色,我有不同的主题。当用户更改主题时,应用程序还应更改该主题的背景颜色。虽然使用应用程序一切都很好,但是当我重建项目时,它并没有比较它应该的颜色。

这是我正在使用的代码:

for i in 0...noteTextView.attributedText.length-1
        {
            noteTextView.attributedText.enumerateAttribute(NSBackgroundColorAttributeName, in: NSMakeRange(i,1), options: NSAttributedString.EnumerationOptions(rawValue: 0)) { (value, range, stop) -> Void in
                    if let exValue = value as? UIColor
                    {
                        if(exValue.isEqualWithConversion(UIColor(hex: 0x2e3f4f))) || (exValue.isEqualWithConversion(UIColor(hex: 0xc0e1ff))) || (exValue.isEqualWithConversion(UIColor(hex: 0x2970ae))) || (exValue.isEqualWithConversion(UIColor(hex: 0xaad5fb)))
                        {
                            aRange = NSMakeRange(i, 1)
                            print("blue")
                            myValue = styles.blueHighlightColor()
                            self.noteTextView.textStorage.addAttribute(attributeName, value: myValue, range: aRange)
                            saveChanges = true
                        }
                        else if (exValue.isEqualWithConversion(UIColor(hex: 0xcafd70))) || (exValue.isEqualWithConversion(UIColor(hex: 0xbde970))) || (exValue.isEqualWithConversion(UIColor(hex: 0x568a56))) || (exValue.isEqualWithConversion(UIColor(hex: 0xbde970)))
                        {
                            aRange = NSMakeRange(i, 1)
                            print("green")
                            myValue = styles.greenHighlightColor()
                            self.noteTextView.textStorage.addAttribute(attributeName, value: myValue, range: aRange)
                            saveChanges = true
                        }
                        else if (exValue.isEqualWithConversion(UIColor(hex: 0x51445d))) || (exValue.isEqualWithConversion(UIColor(hex: 0xd6affb))) || (exValue.isEqualWithConversion(UIColor(hex: 0x79569b))) || (exValue.isEqualWithConversion(UIColor(hex: 0xd6affb)))
                        {
                            aRange = NSMakeRange(i, 1)
                            print("pink")
                            myValue = styles.pinkHighlightColor()
                            self.noteTextView.textStorage.addAttribute(attributeName, value: myValue, range: aRange)
                            saveChanges = true
                        }
                        else if (exValue.isEqualWithConversion(UIColor(hex: 0xffffff))) || (exValue.isEqualWithConversion(UIColor(hex: 0xfbe769))) || (exValue.isEqualWithConversion(UIColor(hex: 0x77745f))) || (exValue.isEqualWithConversion(UIColor(hex: 0xfbe769)))
                        {
                            aRange = NSMakeRange(i, 1)
                            print("yellow")
                            myValue = styles.yellowHighlightColor()
                            self.noteTextView.textStorage.addAttribute(attributeName, value: myValue, range: aRange)
                            saveChanges = true
                        }
                    }
                }

        } // For loop end

我尝试使用'=='并使用此扩展程序:

    extension UIColor
{
    func isEqualWithConversion(_ color: UIColor) -> Bool {
        guard let space = self.cgColor.colorSpace
            else { return false }
        guard let converted = color.cgColor.converted(to: space, intent: .absoluteColorimetric, options: nil)
            else { return false }
        return self.cgColor == converted
    }
}

此外,如果我使用UIColor.red或.blue或.green等标准颜色,它也能正常工作。

3 个答案:

答案 0 :(得分:1)

我需要的解决方案:

 func compareColors (c1:UIColor, c2:UIColor) -> Bool{
    // some kind of weird rounding made the colors unequal so had to compare like this

    var red:CGFloat = 0
    var green:CGFloat  = 0
    var blue:CGFloat = 0
    var alpha:CGFloat  = 0
    c1.getRed(&red, green: &green, blue: &blue, alpha: &alpha)

    var red2:CGFloat = 0
    var green2:CGFloat  = 0
    var blue2:CGFloat = 0
    var alpha2:CGFloat  = 0
    c2.getRed(&red2, green: &green2, blue: &blue2, alpha: &alpha2)

    return return (Int(red*255) == Int(red*255) && Int(green*255) == Int(green2*255) && Int(blue*255) == Int(blue*255) )


}

答案 1 :(得分:0)

我发现比较UIColors的最简单方法是将它们转换为CGColors,因为CoreGraphics有一个名为CGColorEqualToColor的方法。 为了比较,使用

if(CGColorEqualToColor(Exvalue.CGColor, UIColor(hex: 0x2e3f4f).CGColor){
    //code stuffs
}

我无法检查语法是否100%正确(我目前不在计算机上),但您应该能够在xCode中找到它。如果您有任何其他问题,请与我们联系。

答案 2 :(得分:0)

这是我用来获取RGB值的UIColor扩展,也许它会有所帮助:

extension UIColor {
    func rgb() -> (Int?, Int?, Int?) {
        var fRed : CGFloat = 0
        var fGreen : CGFloat = 0
        var fBlue : CGFloat = 0
        var fAlpha: CGFloat = 0
        if self.getRed(&fRed, green: &fGreen, blue: &fBlue, alpha: &fAlpha) {
            let iRed = Int(fRed * 255.0)
            let iGreen = Int(fGreen * 255.0)
            let iBlue = Int(fBlue * 255.0)
            return (iRed, iGreen, iBlue)
        } else {
            // Could not extract RGBA components:
            return (nil,nil,nil)
        }
    }
}

用法:

let newTheme = UIColor(colorLiteralRed: 30.2, green: 46.3, blue: 55.6, alpha: 1.0)
let newThemeRgb = newTheme.rgb()
let currentTheme = myView.backgroundColor
let currentThemeRgb = currentTheme.rgb()
        glClearColor(Float(rgb.0!)/256.0, Float(rgb.1!)/256.0, Float(rgb.2!)/256.0, 0.0);

if newThemeRgb.0 <> currentThemeRgb.0 || newThemeRgb.1 <> currentTheme.1 || newThemeRgb.2 <> currentThemeRgb.2 {
    //change view color
    myView.backgroundColor = newTheme
}