কীভাবে ইউআইসিওলরের তুলনা করবেন?


127

আমি কোনও ইউআইআইমেজভিউতে একটি পটভূমির জন্য রঙ সেটটি চেক করতে চাই। আমি চেষ্টা করেছিলাম:

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

তবে এটি কাজ করে না, এমনকি যখন আমি জানি রঙ সবুজ, তখনও এটি সর্বদা অন্য অংশে পড়ে।

এছাড়াও, ডিবাগ কনসোলে বর্তমান রঙের আউটপুট দেওয়ার কোনও উপায় আছে কি?

p [myimage backgroundColor]

এবং

po [myimage backgroundColor]

কাজ করবেন না

উত্তর:


176

আপনি চেষ্টা করেছেন [myColor isEqual:someOtherColor]?


ধন্যবাদ। ইক্যুয়েলটো দিয়ে পার্থক্য কী? এছাড়াও, আপনি কী এটি ডিবাগারে প্রদর্শন করবেন তা জানেন?
চতুর্থ স্পেস

93
উপায় দ্বারা: এইভাবে রঙের তুলনা করার সময় সাবধানতা অবলম্বন করুন, কারণ তাদের সমান হিসাবে বিবেচনা করতে একই রঙের মডেলটিতে থাকতে হবে। উদাহরণস্বরূপ, # টি ffffffসমান হয় না [UIColor whiteColor]
জুল

2
গুড পয়েন্ট জুল, কেবলমাত্র সমস্যাটিকেই নয় [D
pfrank

11
গুড পয়েন্ট ফ্রাঙ্ক, কেবলমাত্র সমস্যাটি নয় = D- এর সমাধানের দিকে ইঙ্গিত করতে আরও কার্যকর হতে পারে
অ্যালবার্ট রেনশো

বোতামটি তুলনা করার সময় সবসময় আমার জন্য কাজ করে না t টিন্ট কালার আমি যে রঙটিতে সেট করেছিলাম তার সাথে রঙ। রাউন্ডিংয়ের সাথে করণীয় ছিল। আপনি যদি এটি চালান নীচে আমার উত্তর দেখুন।
Pbk

75

হিসাবে zoul মন্তব্য নির্দিষ্ট, isEqual:ফিরে আসবে 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
দুর্দান্ত, তবে আমার মনে হয় একটি ফুটো আছে। আপনি মাঝখানে কখনও সিজি কালারক্রিয়েট প্রকাশ করবেন না।
borrrden

এটি একটি নিখুঁত সমাধান!
অ্যালোনস

ক্যারেটগুলির সাথে কী চলছে তা আপনি ব্যাখ্যা করতে পারেন? আমি মনে করি না আমি এর আগে সিনট্যাক্সটি দেখেছি।
ভিক্টর এঙ্গেল

@ ভিক্টরএঞ্জেল, UIColor *(^convertColorToRGBSpace)(UIColor*) = ^(UIColor *color) ...ঘোষণা করছেন একটি block। তিনি পরে এটি ব্যবহার করে convertColorToRGBSpace(self)। আইওএস-এ ব্লকগুলির জন্য একটি পরিচিতির জন্য
জেআরজি-বিকাশকারী

1
আমি সমস্ত টাইন ব্লক করে থাকি, তবে এর আগে সিনট্যাক্স এর আগে কখনও দেখিনি। আমার ধারণা আমি সম্ভবত এমন কোনও ব্লক ব্যবহার করি নি যা কোনও বস্তু ফিরিয়ে দিয়েছে। আমি যে পোস্টটি দিয়েছিলাম = এর বাম দিকে যা রয়েছে।
ভিক্টর এঙ্গেল

65

এটি কিছুটা দেরীতে হতে পারে তবে কোর গ্রাফিক্সের এটি অর্জনের জন্য একটি সহজ এপিআই রয়েছে:

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

ডকুমেন্টেশন যেমন বলে:

দুটি রঙ সমান কিনা তা সূচিত করে। দুটি বর্ণ সমান হয় যদি তাদের সমান বর্ণের স্থান এবং সংখ্যায় সমান বর্ণের উপাদান থাকে।

এটি অনেক ঝামেলা এবং লিক / কাস্টম অ্যালগরিদমগুলি সমাধান করে।


5
[UIColor isEqual:]এই হিসাবে একই জিনিস না, তাই না? মার্কের উত্তরটি এখনও একমাত্র যা রঙের স্থান ভালভাবে সত্ত্বেও সমতা পরীক্ষা করে।
ম্যাটস্ভেভেন

9
UIColor isEqual:রঙগুলি বিভিন্ন রঙের স্পেসে থাকলে এটি আর কোনও সাহায্য করে না ।
এচেলন

প্রশ্নটি ইউজিকালার তুলনা সম্পর্কিত, সিজি কালার তুলনা সম্পর্কিত নয়।
শন ভিকোরেন

অন্যান্য সমস্ত সমাধানের চেয়ে আরও নির্ভুল :) আমার কাছ থেকে +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

এই ইউআইসিওলর এক্সটেনশনটি সূক্ষ্মভাবে কাজ করে তবে বর্ণিত রঙগুলি আরজিবি ফর্ম্যাটে রূপান্তরিত হতে পারে, যা বেশিরভাগ ক্ষেত্রে হওয়া উচিত।

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

দেশি ইউকালর.একুইয়াল (...) ব্যবহার করে তুলনা করলে উভয় তুলনাই মিথ্যা ফেরত আসবে


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 সমস্ত ধরণের রঙের ক্লাসের জন্য সমর্থিত নয়,
ডক্সটি

1

কিছু অদ্ভুত গোলাকার ত্রুটি ঘটতে পারে। কোনও কারণ হতে পারে কোনও বস্তু কোনও রঙে সেট হয়ে যায় এবং আপনি যে রঙটি সেট করেছেন তা ঠিক মেলে না match

এইভাবে আমি এটি সমাধান করেছি:

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]করে


রঙ স্পেস জুড়ে রঙের তুলনা করার সময় কি এটি কাজ করে?
ভাদাদাদি কার্তিক

নিশ্চিত নয়, আমি এটি সমস্ত রঙের জায়গাগুলির জন্য পরীক্ষা করিনি।
অরুনিট 21

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:আপনি জানেন যে তুলনা ব্যর্থ। (বা ফিরে
আসা বুলেটিয়ানটি

1
আমি কেবল যাচাই করেছি: যদিও তাত্ত্বিকভাবে আরজিবিএ রঙগুলির বিরুদ্ধে একরঙা পরীক্ষা করা সম্ভব, এটি আপনার কোড দিয়ে কাজ করবে না, কারণ getRed:free:blue:alpha:এটি একরঙা রঙে সফল হয় না। সুতরাং আপনার কোডটি এর চেয়ে অন্য কোনও ফল দেয় না is equal:। কিভাবে এটি মোকাবেলা করতে দয়া করে আমার উত্তর দেখুন।
ভাইকিংগোন্ডো

পূর্ণতার জন্য +1! উপরের কোডটি আমার সাধারণ ক্ষেত্রে কাজ করে, তবে এটি প্রদর্শিত হবে এটি কোনও রূপালী বুলেট নয়। ভাল জিনিস.
ডোলিও

0

সুইফটে আরজিসি স্পেস রঙে স্যুইচ করার জন্য এখানে একটি এক্সটেনশন দেওয়া হয়েছে:

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

সুইট ২.২ বৈশিষ্ট্য ব্যবহার করে ইউআইক্লোরারে প্রসারিত করুন। তবে মনে রাখবেন যে আরজিবিএ মানগুলি তুলনা করা হয় এবং এটি সিজিফ্লোট, গোলাকার ত্রুটিগুলি তৈরি করতে পারে যে রঙগুলি একই রকম না হলে সমান হিসাবে ফিরে পাওয়া যায় না (উদাহরণস্বরূপ, তারা আরম্ভের মধ্যে সঠিক একই বৈশিষ্ট্য ব্যবহার করে তৈরি করা হয়নি) (...)!)।

/**
 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

আমি রূপান্তরিত আছে RAF এর উত্তর থেকে সুইফট 4 (পরিবর্তন প্রচুর CGColorএবং সরানো বল unwrapping API এর) কমে উদার ব্যবহারের খাঁজ ধন্যবাদ 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

কেন সমতুল্য প্রোটোকল সহ এক্সটেনশন যুক্ত করবেন না? এই উত্তরটি নিকোলাস মিয়ারির সমাধানটি ব্যবহার করছে। সুতরাং, যদি আপনি এই উত্তরটি পছন্দ করেন তবে দয়া করে তার উত্তরটি পছন্দ করতে স্বাগতম (উপরে থেকে দ্বিতীয়)

জলের মন্তব্য: এইভাবে রঙের তুলনা করার সময় সাবধানতা অবলম্বন করুন, কারণ তাদের সমান হিসাবে বিবেচনা করতে একই রঙের মডেলটিতে থাকতে হবে। উদাহরণস্বরূপ, #ffffff [ইউআইকলার সাদা রঙের] সমান হয় না

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

@ সামভারমেটের উত্তরটি খুব ভাল, আমি খুঁজে পেয়েছি যে এটি বিভিন্ন বর্ণের সাথে (আমার ক্ষেত্রে ) তুলনা করার সময় কখনও কখনও মিথ্যা নেতিবাচক দিকে পরিচালিত করতে 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];
}


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.