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
}
}
}
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];
}
TA贡献1820条经验 获得超9个赞
这可能为时已晚,但是CoreGraphics有一个更简单的API可以实现此目的:
CGColorEqualToColor(myColor.CGColor, [UIColor clearColor].CGColor)
就像文档中说的那样:
指示两种颜色是否相等。如果两种颜色具有相等的色彩空间和数字上相等的颜色分量,则它们是相等的。
这解决了很多麻烦和泄漏/自定义算法。
- 3 回答
- 0 关注
- 617 浏览
添加回答
举报