为了账号安全,请及时绑定邮箱和手机立即绑定

如何比较UIColors?

如何比较UIColors?

iOS
蝴蝶不菲 2019-10-29 13:08:54
我想检查UIImageView上背景的颜色设置。我试过了:if(myimage.backgroundColor == [UIColor greenColor]){...}else{...}但这是行不通的,即使我知道颜色是绿色,它也总是落在其他部分。另外,还有一种方法可以在调试控制台中输出当前颜色。p [myimage backgroundColor]和po [myimage backgroundColor]不工作
查看完整描述

3 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

samvermette的解决方案翻译为swift:


extension UIColor {

    func isEqualToColor(otherColor : UIColor) -> Bool {

        if self == otherColor {

            return true

        }


        let colorSpaceRGB = CGColorSpaceCreateDeviceRGB()

        let convertColorToRGBSpace : ((color : UIColor) -> UIColor?) = { (color) -> UIColor? in

            if CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)) == CGColorSpaceModel.Monochrome {

                let oldComponents = CGColorGetComponents(color.CGColor)

                let components : [CGFloat] = [ oldComponents[0], oldComponents[0], oldComponents[0], oldComponents[1] ]

                let colorRef = CGColorCreate(colorSpaceRGB, components)

                let colorOut = UIColor(CGColor: colorRef!)

                return colorOut

            }

            else {

                return color;

            }

        }


        let selfColor = convertColorToRGBSpace(color: self)

        let otherColor = convertColorToRGBSpace(color: otherColor)


        if let selfColor = selfColor, otherColor = otherColor {

            return selfColor.isEqual(otherColor)

        }

        else {

            return false

        }

    }

}


查看完整回答
反对 回复 2019-10-29
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

正如zoul在评论中指出的那样,当比较不同模型/空间中的颜色(例如与)时,isEqual:将返回。我编写了这个UIColor扩展,可以在比较它们之前将两种颜色转换为相同的颜色空间:NO#FFF[UIColor whiteColor]


- (BOOL)isEqualToColor:(UIColor *)otherColor {

    CGColorSpaceRef colorSpaceRGB = CGColorSpaceCreateDeviceRGB();


    UIColor *(^convertColorToRGBSpace)(UIColor*) = ^(UIColor *color) {

        if (CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)) == kCGColorSpaceModelMonochrome) {

            const CGFloat *oldComponents = CGColorGetComponents(color.CGColor);

            CGFloat components[4] = {oldComponents[0], oldComponents[0], oldComponents[0], oldComponents[1]};

            CGColorRef colorRef = CGColorCreate( colorSpaceRGB, components );


            UIColor *color = [UIColor colorWithCGColor:colorRef];

            CGColorRelease(colorRef);

            return color;            

        } else

            return color;

    };


    UIColor *selfColor = convertColorToRGBSpace(self);

    otherColor = convertColorToRGBSpace(otherColor);

    CGColorSpaceRelease(colorSpaceRGB);


    return [selfColor isEqual:otherColor];

}


查看完整回答
反对 回复 2019-10-29
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

这可能为时已晚,但是CoreGraphics有一个更简单的API可以实现此目的:


CGColorEqualToColor(myColor.CGColor, [UIColor clearColor].CGColor)

就像文档中说的那样:


指示两种颜色是否相等。如果两种颜色具有相等的色彩空间和数字上相等的颜色分量,则它们是相等的。


这解决了很多麻烦和泄漏/自定义算法。


查看完整回答
反对 回复 2019-10-29
  • 3 回答
  • 0 关注
  • 617 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信