UIColors की तुलना कैसे करें?


127

मैं UIImageView पर पृष्ठभूमि के लिए निर्धारित रंग की जांच करना चाहता हूं। मैंने कोशिश की:

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

लेकिन यह तब भी काम नहीं करता है, जब मुझे पता है कि रंग हरा है, यह हमेशा दूसरे हिस्से में पड़ता है।

इसके अलावा, डिबग कंसोल में वर्तमान रंग को आउटपुट करने का एक तरीका है।

p [myimage backgroundColor]

तथा

po [myimage backgroundColor]

काम नहीं करते।

जवाबों:


176

क्या आपने कोशिश की है [myColor isEqual:someOtherColor]?


धन्यवाद। IsEqualTo के साथ क्या अंतर है? इसके अलावा, क्या आप जानते हैं कि इसे डिबगर में कैसे प्रदर्शित किया जाए?
4thस्पेस

93
वैसे: इस तरह से रंगों की तुलना करते समय सावधान रहें, क्योंकि उन्हें समान रंग के मॉडल में समान माना जाता है। उदाहरण के लिए, # ffffffबराबर नहीं है [UIColor whiteColor]
zoul

2
अच्छा बिंदु Zoul, एक समस्या का समाधान करने के लिए और अधिक उपयोगी हो सकता है, न कि केवल समस्या के लिए = D
pfrank

11
अच्छी बात यह है कि Pfrank, समस्या के समाधान के लिए अधिक उपयोगी हो सकता है, न कि केवल समस्या के लिए = D
अल्बर्ट रेनशॉ

हमेशा एक बटन की तुलना करते समय मेरे लिए काम नहीं किया था। रंग के लिए रंग मैंने इसे सेट किया था। गोलाई से करना था। यदि आप इसमें भाग लेते हैं तो नीचे मेरा उत्तर देखें।
पब

75

जैसा कि जूल ने टिप्पणियों में बताया है, विभिन्न मॉडलों / स्थानों (उदाहरण के लिए ) के रंगों की तुलना करते समय 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];
}

2
अच्छा है, लेकिन मुझे लगता है कि एक लीक है। आप कभी भी CGColorCreate को बीच में जारी न करें।
बोरप्रेडन

यह एक सही समाधान है!
alones

क्या आप बता सकते हैं कि कैरेट के साथ क्या हो रहा है? मुझे नहीं लगता कि मैंने पहले उस वाक्य रचना को देखा है।
विक्टर एंगेल

@VictorEngel, ए UIColor *(^convertColorToRGBSpace)(UIColor*) = ^(UIColor *color) ...की घोषणा कर रहा है block। वह बाद में इसका उपयोग करता है convertColorToRGBSpace(self)। IOS में ब्लॉकों के लिए एक परिचय के लिए, raywenderlich.com/9328/creating-a-diner-app-using-blocks-part-1
JRG-Developer

1
मैं सभी टाइन को ब्लॉक करता हूं, लेकिन मैंने सिंटैक्स को पहले कभी इस तरह नहीं देखा है। मुझे लगता है कि शायद मैंने एक ब्लॉक का उपयोग नहीं किया है जो एक वस्तु लौटाता है। यह क्या = के बाईं ओर है कि मैं के बारे में पोस्ट कर रहा था।
विक्टर एंगेल

65

यह थोड़ा बहुत देर हो सकती है, लेकिन CoreGraphics के पास इसे प्राप्त करने के लिए एक आसान API है:

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

जैसे प्रलेखन कहता है:

इंगित करता है कि क्या दो रंग समान हैं। दो रंग समान हैं यदि उनके पास समान रंग रिक्त स्थान और संख्यात्मक रूप से समान रंग घटक हैं।

यह एक बहुत परेशानी और लीक / कस्टम एल्गोरिदम को हल करता है।


5
[UIColor isEqual:]के रूप में एक ही बात करता है, यह नहीं करता है? मार्क का जवाब अभी भी केवल एक ही है जो रंग अंतरिक्ष के बावजूद समतुल्यता की जांच करता है।
मैट

9
UIColor isEqual:यदि रंग अलग-अलग रंग के स्थानों में हों , तो इससे अधिक मदद नहीं मिलती है ।
इकलौती

सवाल UIColor तुलना के बारे में है, CGColor तुलना नहीं।
सीन विकोरन

अन्य सभी समाधानों की तुलना में अधिक सटीक :) मुझ से +1
नीरव गढ़िया

8

समरूपता के समाधान का अनुवाद तेज करने के लिए किया गया है:

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

@ रुडॉल्फ एडमकोविक, यह पाइथागोरस प्रमेय है
विक्टर गोल्टिवैनिट्स

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 (...) का उपयोग करके तुलना की जाती है, तो दोनों तुलनाएं झूठी होंगी


5

मैंने यह श्रेणी लिखी है। यदि isEqual:कोई रिटर्न नहीं देता है, तो यह परीक्षण करेगा कि क्या विभिन्न घटकों की तुलना अभी भी मेल खा सकती है। यदि संभव हो, तो विभिन्न मॉडलों की तुलना अभी भी की जाती है।

@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]इस तरह की तुलना कर रहे होते हैं , यदि आप पृष्ठभूमि को बदल देते हैं, तो उस बयान से पहले हरे रंग को बदल दें, यह काम नहीं कर रहा है।

मुझे अपने रंग के खेल में एक ही समस्या थी और मैंने हल किया कि आरजीबी रंगों में सरल अंतर समीकरण का उपयोग करके आप तुरंत एक नज़र डाल सकते हैं कि शॉर्ट कोड नमूना 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 20

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
केवल हरे घटक की तुलना में रंग समान नहीं हैं
बेन सिनक्लेयर

यह एकमात्र उत्तर है जो संभावित गोलाई त्रुटियों को संबोधित करने का प्रयास करता है और अलग-अलग माध्यमों से निर्धारित रंगों की तुलना करते हुए फसल कर सकता है; इसलिए, जबकि यह केवल हरे रंग पर केंद्रित है, उदाहरण (उत्तर के लेखक के रूप में) को सामान्यीकृत किया जा सकता है। जैसे, और चूंकि गोलाई वास्तव में जिस समस्या में चल रही थी, मुझे यह उत्तर मददगार लगा।
मैट वैगनर

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]है


क्या यह रंग अंतरिक्ष में रंगों की तुलना करते समय काम करता है?
वड्डदी कार्तिक

यकीन नहीं है, मैंने इसे सभी रंग स्थानों के लिए परीक्षण नहीं किया है।
arunit21

1

अन्य समाधान सही ढंग से काम नहीं किया। यहाँ एक दृष्टिकोण है जो स्विफ्ट में काम करता है:

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

यह पैटर्न के रंग के रूप में किनारे के मामलों के लिए काम नहीं कर सकता है। डॉक्टर से यदि रंग संगत रंग स्थान पर है, तो रंग आरजीबी प्रारूप में परिवर्तित हो जाता है और इसके घटक आपके आवेदन पर वापस आ जाते हैं। यदि रंग संगत रंग स्थान में नहीं है, तो पैरामीटर अपरिवर्तित हैं। तो आप प्रत्येक फ्लोट को तुरंत शुरू कर सकते हैं -1और यदि किसी को कॉल करने के बाद भी यह मूल्य है getRed:green:blue:alpha:, तो आप जानते हैं कि तुलना विफल रही। (या लौटे हुए बूलियन को न छोड़ें क्योंकि यह आपको बताएगा कि क्या इसे सफलतापूर्वक कहा गया है।)
vikingosegundo

1
मैंने अभी-अभी जाँच की है: हालाँकि यह संभव है कि सिद्धांत में RGBA रंगों के खिलाफ मोनोक्रोम की जाँच करें, यह आपके कोड के साथ काम नहीं करेगा, क्योंकि getRed:free:blue:alpha:मोनोक्रोम रंग पर सफल नहीं होगा । तो आपके कोड से एक और परिणाम नहीं निकलेगा is equal:। कृपया मेरा उत्तर देखें कि इससे कैसे निपटा जाए।
vikingosegundo

+1 पूरी तरह से! उपरोक्त कोड मेरे साधारण मामले के लिए काम करता है, लेकिन ऐसा प्रतीत होता है कि यह कोई चांदी की गोली नहीं है। अच्छी चीज़।
कबूतर

0

यहाँ स्विफ्ट में 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

स्विफ्ट 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

यूआईसीकलर एक्सटेंशन

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

मैंने राफ के जवाब को बदल दिया है स्विफ्ट 4 ( CGColorएपीआई में बहुत सारे बदलाव ) में बदल दिया है, बल को हटा दिया है और उदार उपयोग के लिए धन्यवाद के कारण इंडेंटेशन को कम कर दिया है 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

समतुल्य प्रोटोकॉल के साथ एक्सटेंशन क्यों नहीं जोड़ा गया? यह उत्तर निकोलस मारी के समाधान का उपयोग कर रहा है। इसलिए, यदि आपको यह उत्तर पसंद है, तो कृपया उसका उत्तर पसंद करें (ऊपर से दूसरा)

ज़ूल की टिप्पणी: रंगों की तुलना इस तरह से करें, क्योंकि उन्हें समान रंग के मॉडल के बराबर माना जाना है। उदाहरण के लिए, #fffffffffffffffff '

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) की तुलना करते समय यह कभी-कभी झूठी नकारात्मकता पैदा कर सकता है । मैंने इसे 'अन्य' में भी स्पष्ट रूप से रंग बनाकर तय किया:

- (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];
}


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.