UIColor를 비교하는 방법?


127

UIImageView에서 배경의 색상 세트를 확인하고 싶습니다. 난 노력 했어:

if(myimage.backgroundColor == [UIColor greenColor]){
...}
else{
...}

그러나 색상이 녹색임을 알더라도 항상 다른 부분으로 떨어집니다.

또한 디버그 콘솔에서 현재 색상을 출력하는 방법이 있습니까?

p [myimage backgroundColor]

po [myimage backgroundColor]

작동하지 않습니다.

답변:


176

당신은 시도 했습니까 [myColor isEqual:someOtherColor]?


감사. isEqualTo와의 차이점은 무엇입니까? 또한 디버거에 표시하는 방법을 알고 있습니까?
4thSpace

93
그건 그렇고 : 색상을 동일하게 간주하려면 동일한 색상 모델에 있어야하기 때문에이 방법으로 색상을 비교할 때주의하십시오. 예를 들어 # ffffff은 같지 않습니다 [UIColor whiteColor].
zoul

2
좋은 점 Zoul은 문제가 아니라 해결책을 지적하는 것이 더 유용 할 수 있습니다. = D
pfrank

11
좋은 지적 Pfrank는 솔루션 = D하지만 단지 문제 점에 더 유용 할 수 있습니다
알버트 렌쇼

button.tintColor를 내가 설정 한 색상과 비교할 때 항상 효과가 없었습니다. 반올림과 관련이 있습니다. 이 문제가 발생하면 아래 답변을 참조하십시오.
Pbk

75

zoul이 주석에서 지적했듯이 다른 모델 / 공간에있는 색상을 비교하면 (예 :을 사용 하여 ) isEqual:반환 NO됩니다 . 나는이 색상을 비교하기 전에 두 색상을 동일한 색상 공간으로 변환하는 UIColor 확장을 작성했습니다.#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];
}

2
멋지지만 누수가 있다고 생각합니다. CGColorCreate를 중간에 해제하지 마십시오.
borrrden

이것은 완벽한 솔루션입니다!
홀로

캐럿에 무슨 일이 일어나고 있는지 설명 할 수 있습니까? 나는 그 구문을 전에 본 적이 없다고 생각합니다.
Victor Engel

@VictorEngel UIColor *(^convertColorToRGBSpace)(UIColor*) = ^(UIColor *color) ...은을 선언합니다 block. 그는 나중에와 함께 사용합니다 convertColorToRGBSpace(self). iOS의 블록에 대한 소개는 raywenderlich.com/9328/creating-a-diner-app-using-blocks-part-1
JRG-Developer

1
나는 모든 타인을 사용하지만 이전에는 이런 식으로 구문을 본 적이 없습니다. 객체를 반환하는 블록을 사용하지 않은 것 같습니다. 내가 게시 한 =의 왼쪽에있는 내용입니다.
Victor Engel

65

이것은 너무 늦을 수 있지만 CoreGraphics는 이것을 달성하기 쉬운 API를 가지고 있습니다 :

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

문서가 말하는 것처럼 :

두 색상이 같은지 여부를 나타냅니다. 색상 공간이 같고 색상 성분이 동일한 경우 두 색상이 동일합니다.

이것은 많은 문제와 누출 / 맞춤 알고리즘을 해결합니다.


5
[UIColor isEqual:]이것과 똑같습니까? Mark의 대답은 여전히 ​​색상 공간에도 불구하고 동등성을 검사하는 유일한 방법입니다.
mattsven

9
UIColor isEqual:색상이 다른 색상 공간에있는 경우 보다 더 이상 도움이되지 않습니다 .
Echelon

문제는 CGColor 비교가 아니라 UIColor 비교에 관한 것입니다.
Sean Vikoren

다른 모든 솔루션보다 더 정확 :) +1 +
Nirav Gadhiya

8

samvermette의 솔루션이 신속하게 번역되었습니다.

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
        }
    }
}

7
#import "UIColor-Expanded.h"
//https://github.com/thetaplab/uicolor-utilities

//RGB distance
CGFloat distance = sqrtf(powf((clr0.red - clr1.red), 2) + powf((clr0.green - clr1.green), 2) + powf((clr0.blue - clr1.blue), 2) );
if(distance<=minDistance){
....
}else{
...
}

@Rudolf Adamkovic, 그것은 피타고라스의 정리입니다
Viktor Goltvyanitsa

6

이 UIColor 확장은 비교 된 색상을 RGB 형식으로 변환 할 수있는 경우 잘 작동합니다. 대부분의 경우에 해당됩니다.

public extension UIColor {

    static func == (l: UIColor, r: UIColor) -> Bool {
        var l_red = CGFloat(0); var l_green = CGFloat(0); var l_blue = CGFloat(0); var l_alpha = CGFloat(0)
        guard l.getRed(&l_red, green: &l_green, blue: &l_blue, alpha: &l_alpha) else { return false }
        var r_red = CGFloat(0); var r_green = CGFloat(0); var r_blue = CGFloat(0); var r_alpha = CGFloat(0)
        guard r.getRed(&r_red, green: &r_green, blue: &r_blue, alpha: &r_alpha) else { return false }
        return l_red == r_red && l_green == r_green && l_blue == r_blue && l_alpha == r_alpha
    }
}

최소한이 확장으로 :

UIColor.whiteColor == UIColor(hex: "#FFFFFF") // true
UIColor.black == UIColor(red: 0, green: 0, blue: 0, alpha: 1) // true

네이티브 UColor.isEqual (...)을 사용하여 비교하면 두 비교 모두 false를 반환합니다.


5

나는이 카테고리를 썼다. 경우 isEqual:NO를 반환하지 다른 구성 요소의 추가 비교는 여전히 일치 할 수 있다면, 그것은 테스트합니다. 가능하면 다른 모델이 여전히 비교됩니다.

@implementation UIColor (Matching)


-(BOOL)matchesColor:(UIColor *)color error:(NSError *__autoreleasing *)error
{
    UIColor *lhs = self;
    UIColor *rhs = color;

    if([lhs isEqual:rhs]){ // color model and values are the same
        return YES;
    }

    CGFloat red1, red2, green1, alpha1, green2, blue1, blue2, alpha2;
    BOOL lhsSuccess = [lhs getRed:&red1 green:&green1 blue:&blue1 alpha:&alpha1];
    BOOL rhsSuccess = [rhs getRed:&red2 green:&green2 blue:&blue2 alpha:&alpha2];
    if((!lhsSuccess && rhsSuccess) || (lhsSuccess && !rhsSuccess)){ // one is RGBA, one color not.
        CGFloat r,g,b,a;
        if(!lhsSuccess){ // lhs color could be a monochrome
            const CGFloat *components = CGColorGetComponents(lhs.CGColor);
            if([lhs _colorSpaceModel] == kCGColorSpaceModelMonochrome){
                r = g = b = components[0];
                a = components[1];

                return r == red2 && g == green2 && b == blue2 && a == alpha2;
            }
        } else {  // rhs color could be a monochrome
            const CGFloat *components = CGColorGetComponents(rhs.CGColor);

            if([rhs _colorSpaceModel] == kCGColorSpaceModelMonochrome){
                r = g = b = components[0];
                a = components[1];
                return r == red1 && g == green1 && b == blue1 && a == alpha1;
            }
        }


        NSError *aError = [[NSError alloc] initWithDomain:@"UIColorComparision" code:-11111 userInfo:[self _colorComparisionErrorUserInfo]];
        *error = aError;
        return  NO;
    } else if (!lhsSuccess && !rhsSuccess){ // both not RGBA, lets try HSBA
        CGFloat hue1,saturation1,brightness1;
        CGFloat hue2,saturation2,brightness2;

        lhsSuccess = [lhs getHue:&hue1 saturation:&saturation1 brightness:&brightness1 alpha:&alpha1];
        rhsSuccess = [lhs getHue:&hue2 saturation:&saturation2 brightness:&brightness2 alpha:&alpha2];
        if((!lhsSuccess && rhsSuccess) || (lhsSuccess && !rhsSuccess)){
            NSError *aError = [[NSError alloc] initWithDomain:@"UIColorComparision" code:-11111 userInfo:[self _colorComparisionErrorUserInfo]];
            *error = aError;
            return  NO;
        } else if(!lhsSuccess && !rhsSuccess){ // both not HSBA, lets try monochrome
            CGFloat white1, white2;

            lhsSuccess = [lhs getWhite:&white1 alpha:&alpha1];
            rhsSuccess = [rhs getWhite:&white2 alpha:&alpha2];
            if((!lhsSuccess && rhsSuccess) || (lhsSuccess && !rhsSuccess)){
                NSError *aError = [[NSError alloc] initWithDomain:@"UIColorComparision" code:-11111 userInfo:[self _colorComparisionErrorUserInfo]];
                *error = aError;
                return  NO;
            } else {
                return white1 == white2 && alpha1 == alpha2;
            }

        } else {
            return hue1 == hue2 && saturation1 == saturation2 && brightness1 == brightness2 && alpha1 == alpha2;
        }

    } else {
        return (red1 == red2 && green1 == green2 && blue1 == blue2 && alpha1 == alpha2);

    }
}

-(NSDictionary *)_colorComparisionErrorUserInfo{

    NSDictionary *userInfo = @{
                               NSLocalizedDescriptionKey: NSLocalizedString(@"Comparision failed.", nil),
                               NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"The colors models are incompatible. Or the color is a pattern.", nil),

                               };
    return userInfo;
}

- (CGColorSpaceModel)_colorSpaceModel {
    return CGColorSpaceGetModel(CGColorGetColorSpace(self.CGColor));
}

@end

UIColor *green1 = [UIColor greenColor];
UIColor *green2 = [UIColor colorWithRed:0 green:1 blue:0 alpha:1];
UIColor *yellow = [UIColor yellowColor];
UIColor *grey1  = [UIColor colorWithWhite:2.0/3.0 alpha:1];
UIColor *grey2  = [UIColor lightGrayColor];

NSError *error1, *error2, *error3, *error4, *error5;

BOOL match1 = [green1 matchesColor:green2 error:&error1];   // YES
BOOL match2 = [green1 matchesColor:yellow error:&error2];   // NO
BOOL match3 = [green1 matchesColor:grey1 error:&error3];    // NO
BOOL match4 = [grey1 matchesColor:grey2 error:&error4];     // YES
BOOL match5 = [grey1 matchesColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"bg.png"]]
                            error:&error5];                 // NO, Error

2

myimage.backgroundColor == [UIColor greenColor]이 문장을 비교 하기 전에 backgroundColor를 녹색으로 변경하지 않은 경우 이와 같이 비교하면 작동하지 않습니다.

내 색상 게임에서 동일한 문제가 있었고 RGB 색상의 간단한 차이 방정식을 사용하여 짧은 코드 샘플 ColorProcess를 여기 에서 빠르게 볼 수 있음을 해결 했습니다.

빅터가 대답하는 것처럼

GFloat distance = sqrtf(powf((clr0.red - clr1.red), 2) + powf((clr0.green - clr1.green), 2) + powf((clr0.blue - clr1.blue), 2) );
if(distance<=minDistance){
....
}else{

}

해당 코드 샘플 대신 사용할 수 있습니다

include "UIColorProcess.h"

..

float distance = [UIColorProcess findDistanceBetweenTwoColor:[UIColor redColor] secondColor:[UIColor blueColor]];

물론 0을 반환하면 너무 비슷한 색상을 비교한다는 의미입니다. 반환 범위는 (0.0f-1.5f)와 같습니다.


color.red/blue/green은 모든 유형의 색상 클래스에서 지원되지 않습니다. 문서 확인
pfrank

1

이상한 반올림 오류가 발생할 수 있습니다. 오브젝트가 색상으로 설정되어 있고 설정 한 색상이 정확히 일치하지 않는 이유 일 수 있습니다.

이것이 내가 해결 한 방법입니다.

private 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 (Int(green*255) == Int(green2*255))

}

이 코드는 1을 비교할뿐만 아니라 모든 구성 요소를 비교하여 개선 할 수 있습니다. 예를 들어 빨강 + 녹색 + 파랑 + 알파 == 빨강 2 + 녹색 2 + 파랑 2 + 알파 2


1
녹색 성분 만 비교하면 색상이 동일하지 않음
Ben Sinclair

이것은 다른 방법으로 설정된 색상을 비교하면서 발생할 수있는 잠재적 반올림 오류를 언급하고 해결하려는 유일한 대답입니다. 따라서 녹색에만 초점을 맞추고 있지만 답변 답변 작성자가 예로 든 예제를 일반화 할 수 있습니다. 따라서 반올림은 실제로 내가 겪고있는 문제 이므로이 답변이 도움이되는 것으로 나타났습니다.
매트 와그너

1

모든 경우에 도움이되는이 확장 프로그램을 사용하고 있습니다.

/***** UIColor Extension to Compare colors as string *****/
@interface UIColor (compare)
- (BOOL)compareWithColor:(UIColor *)color;
@end

@implementation UIColor(compare)
- (BOOL)compareWithColor:(UIColor *)color {
    return ([[[CIColor colorWithCGColor:self.CGColor] stringRepresentation] isEqualToString:[[CIColor colorWithCGColor:color.CGColor] stringRepresentation]]);
}
@end
/**** End ****/

희망이 도움이됩니다.

참고 : 이 확장 #ffffff과 동일 [UIColor whiteColor]합니다


색상 공간에서 색상을 비교하는 동안 작동합니까?
Vaddadi Kartick

확실하지 않습니다. 모든 색상 공간에 대해 테스트하지 않았습니다.
arunit21

1

다른 솔루션은 제대로 작동하지 않았습니다. Swift에서 작동하는 접근 방식은 다음과 같습니다.

import CoreGraphics

extension UIColor {

    /**
     Checks for visual equality of two colors regardless of their color space.
     - parameter    color:  The other color for comparison.
     - returns:     A boolean representing whether the colors are visually the same color.
     */
    public func isVisuallyEqualTo(_ color: UIColor) -> Bool {
        return rgbaComponents == color.rgbaComponents
    }

    public var rgbaComponents: [CGFloat] {
        var data = [CUnsignedChar](repeating: 0, count: 4)
        let colorSpace = CGColorSpaceCreateDeviceRGB()
        let context = CGContext(data: &data,
                                width: 1, height: 1,
                                bitsPerComponent: 8, bytesPerRow: 4,
                                space: colorSpace,
                                bitmapInfo: CGImageAlphaInfo.noneSkipLast.rawValue)
        context?.setFillColor(cgColor)
        context?.fill(CGRect(x: 0, y: 0, width: 1, height: 1))
        return data.map { CGFloat($0) / 255.0 }
    }

}

0

이건 어떤가요:

+(BOOL)color:(UIColor *)color1 matchesColor:(UIColor *)color2
{
    CGFloat red1, red2, green1, green2, blue1, blue2, alpha1, alpha2;
    [color1 getRed:&red1 green:&green1 blue:&blue1 alpha:&alpha1];
    [color2 getRed:&red2 green:&green2 blue:&blue2 alpha:&alpha2];

    return (red1 == red2 && green1 == green2 && blue1 == blue2 && alpha1 == alpha2);
}

가장자리의 경우 패턴 색상으로 작동하지 않을 수 있습니다. doc 에서 색상이 호환 가능한 색상 공간에 있으면 색상이 RGB 형식으로 변환되고 해당 구성 요소가 응용 프로그램으로 반환됩니다. 색상이 호환 가능한 색상 공간에 없으면 매개 변수는 변경되지 않습니다. 따라서 각 부동 소수점을 인스턴스화 할 수 -1있으며를 호출 한 후에도 여전히이 값이 있으면 getRed:green:blue:alpha:비교가 실패한 것입니다. (또는 성공적으로 호출되었는지 여부를 알려주기 때문에 반환 된 부울을 생략하지 마십시오.)
vikingosegundo

1
방금 확인했습니다 : 이론적으로 RGBA 색상과 비교하여 흑백을 확인할 수는 있지만 단색 색상에서는 getRed:free:blue:alpha:성공 하지 않으므로 코드에서 작동하지 않습니다 . 따라서 코드는 이외의 다른 결과를 생성하지 않습니다 is equal:. 내 대답을 참조하십시오.
vikingosegundo 2014 년

철저히 +1! 위의 코드는 간단한 경우에는 작동하지만 은색 총알이 아닌 것으로 보입니다. 좋은 물건.
dooleyo

0

Swift에서 RGC 공간 색상으로 전환하는 확장 기능은 다음과 같습니다.

extension UIColor {

func convertColorToRGBSpaceColor() -> UIColor {
    let colorSpaceRGB = CGColorSpaceCreateDeviceRGB()
    let oldComponents = CGColorGetComponents(self.CGColor)
    let components = [oldComponents[0], oldComponents[0], oldComponents[0], oldComponents[1]]
    let colorRef = CGColorCreate(colorSpaceRGB, components)
    let convertedColor = UIColor(CGColor: colorRef!)
    return convertedColor
}

}


0

Swift 2.2 기능을 사용한 UIColor 확장. 그러나 RGBA 값이 비교되고 CGFloat이므로 반올림 오류로 인해 색상이 정확히 동일하지 않으면 색상이 동일하게 반환되지 않을 수 있습니다 (예 : init에서 정확히 동일한 속성을 사용하여 원래 생성되지 않은 경우). (...)!).

/**
 Extracts the RGBA values of the colors and check if the are the same.
 */

public func isEqualToColorRGBA(color : UIColor) -> Bool {
    //local type used for holding converted color values
    typealias colorType = (red : CGFloat, green : CGFloat, blue : CGFloat, alpha : CGFloat)
    var myColor         : colorType = (0,0,0,0)
    var otherColor      : colorType = (0,0,0,0)
    //getRed returns true if color could be converted so if one of them failed we assume that colors are not equal
    guard getRed(&myColor.red, green: &myColor.green, blue: &myColor.blue, alpha: &myColor.alpha) &&
        color.getRed(&otherColor.red, green: &otherColor.green, blue: &otherColor.blue, alpha: &otherColor.alpha)
        else {
            return false
    }
    log.debug("\(myColor) = \(otherColor)")
    //as of Swift 2.2 (Xcode 7.3.1), tuples up to arity 6 can be compared with == so this works nicely
    return myColor == otherColor
}

0

UIColor 확장

- (CGFloat)accuracyCompareWith:(UIColor *)color {
    CIColor *c1 = [[CIColor alloc] initWithColor:self];
    CIColor *c2 = [[CIColor alloc] initWithColor:color];

    BOOL hasAlpha = c1.numberOfComponents == 4 && c2.numberOfComponents == 4;
    NSInteger numberOfComponents = hasAlpha ? 4 : 3;

    CGFloat colorMax = 1.0;
    CGFloat p = colorMax / 100.0;

    CGFloat redP = fabs(c1.red / p - c2.red / p);
    CGFloat greenP = fabs(c1.green / p - c2.green / p);
    CGFloat blueP = fabs(c1.blue / p - c2.blue / p);
    CGFloat alphaP = 0;

    if (hasAlpha)
        alphaP = fabs(c1.alpha / p - c2.alpha / p);

    return (redP + greenP + blueP + alphaP) / (CGFloat)numberOfComponents;
}

0

나는 raf의 답변Swift 4 ( CGColorAPI의 많은 변경 사항)로 변환하고 힘을 줄이지 않고 제거하여 들여 쓰기를 줄였습니다 guard.

@extension UIColor {
    func isEqualToColor(otherColor: UIColor) -> Bool {
        if self == otherColor {
            return true
        }
        let colorSpaceRGB = CGColorSpaceCreateDeviceRGB()
        let convertColorToRGBSpace: ((UIColor) -> UIColor?) = { (color) -> UIColor? in
            guard color.cgColor.colorSpace?.model == .monochrome else {
                return color
            }
            guard let oldComponents = color.cgColor.components else {
                return nil
            }
            let newComponents = [oldComponents[0], oldComponents[0], oldComponents[0], oldComponents[1]]
            guard let colorRef = CGColor(colorSpace: colorSpaceRGB, components: newComponents) else {
                    return nil
            }
            return UIColor(cgColor: colorRef)
        } 

        guard let selfColor = convertColorToRGBSpace(self), 
              let otherColor = convertColorToRGBSpace(otherColor) else {
            return false
        }
        return selfColor.isEqual(otherColor)
    }
}

0

동일 프로토콜로 확장을 추가하지 않는 이유는 무엇입니까? 이 답변은 Nicolas Miari의 솔루션을 사용하고 있습니다. 따라서이 답변이 마음에 드시면 그의 답변을 좋아하십시오 (위에서 두 번째).

Zoul의 의견 : 색상을 동일한 것으로 간주하려면 동일한 색상 모델에 있어야하므로 이러한 방식으로 색상을 비교할 때주의하십시오. 예를 들어 #ffffff는 [UIColor whiteColor]와 같지 않습니다.

static func == (lhs: UIColor, rhs: UIColor) -> Bool {

    let colorSpaceRGB = CGColorSpaceCreateDeviceRGB()
    let convertColorToRGBSpace: ((UIColor) -> UIColor?) = { (color) -> UIColor? in
        guard color.cgColor.colorSpace?.model == .monochrome else {
            return color
        }
        guard let oldComponents = color.cgColor.components else {
            return nil
        }
        let newComponents = [oldComponents[0], oldComponents[0], oldComponents[0], oldComponents[1]]
        guard let colorRef = CGColor(colorSpace: colorSpaceRGB, components: newComponents) else {
            return nil
        }
        return UIColor(cgColor: colorRef)
    }

    guard let selfColor = convertColorToRGBSpace(lhs),
        let otherColor = convertColorToRGBSpace(rhs) else {
            return false
    }
    return selfColor.isEqual(otherColor)
}

0

@samvermette의 답변이 매우 좋지만 다른 색상 유형을 비교할 때 때로는 잘못된 음의 결과를 초래할 수 있음을 알았습니다 (내 경우에는 UIDeviceRGBColor~ UICachedDeviceWhiteColor). `else '에 색상을 명시 적으로 만들어서 고쳤습니다.

- (BOOL)isEqualToColor:(UIColor *)otherColor
{
    if (self == otherColor)
        return YES;

    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
        {
            const CGFloat *oldComponents = CGColorGetComponents(color.CGColor);
            CGFloat components[4] = {oldComponents[0], oldComponents[1], oldComponents[2], oldComponents[3]};
            CGColorRef colorRef = CGColorCreate(colorSpaceRGB, components);
            UIColor *color = [UIColor colorWithCGColor:colorRef];
            CGColorRelease(colorRef);
            return color;
        }
    };

    UIColor *selfColor = convertColorToRGBSpace(self);
    otherColor = convertColorToRGBSpace(otherColor);
    CGColorSpaceRelease(colorSpaceRGB);

    return [selfColor isEqual:otherColor];
}


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.