2015-06-18 47 views
1

我想比較兩個使用[UIColor colorWithPatternImage:]生成的UIColors是否相等。我似乎無法弄清楚如何做到這一點。比較相等的[UIColor colorWithPatternImage:]

[[UIColor colorWithPatternImage:[UIImage imageNamed:@"camo2"]] isEqual: 
[UIColor colorWithPatternImage:[UIImage imageNamed:@"camo2"]]] 

總是返回false,無論是使用==還是isEqual。有人知道是否可以正確比較colorWithPatternImages,或者我認爲是CGPatterns?我也嘗試過比較CGColorGetPattern(color.CGColor),但這也不起作用。

編輯:這是因爲我有一個功能,接受一個UIColor,並給我一個NSString顯示給用戶。

+(NSString *)colorNameForColor:(UIColor *)color { 

    if ([color isEqual:[UIColor whiteColor]]) { 
     return @"White"; 
    } 

    if ([color isEqual:[UIColor colorWithPatternImage:[UIImage imageNamed:@"camo"]]]) { 
     return @"Camo"; 
    } 
    ... 
} 

這只是一個瘋狂的事情嗎?我想我可以做我自己的對象,有一個顏色屬性和colorName屬性...

+1

平等(創建從任何一種模式或RGB)都沒有很好的定義。通常,沒有理由比較顏色。如果你需要比較顏色,你做錯了什麼。 – Sulthan

+1

@Sulthan當單元測試時,我測試顏色一點點。 – psobko

回答

1

使用私有API的

這花的CoreGraphics一些逆向工程,但我能找到一個私有方法_CGPatternGetImage出現返回圖像。

你需要包括以下標題:

#include <dlfcn.h> 
@import CoreGraphics; 

創建一個函數指針:

typedef CGImageRef (*CGPatternGetImage)(CGPatternRef pattern); 

,然後訪問功能:

-(void)comparePatterns 
{ 
    void *handle = dlopen("/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics", RTLD_NOW); 
    CGPatternGetImage getImage = (CGPatternGetImage) dlsym(handle, "CGPatternGetImage"); 

    UIColor *aColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"pattern1"]]; 
    UIColor *bColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"pattern1"]]; 
    UIColor *cColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"pattern2"]]; 

    NSData *aImageData = UIImagePNGRepresentation([UIImage imageWithCGImage:getImage(CGColorGetPattern(aColor.CGColor))]); 
    NSData *bImageData = UIImagePNGRepresentation([UIImage imageWithCGImage:getImage(CGColorGetPattern(bColor.CGColor))]); 
    NSData *cImageData = UIImagePNGRepresentation([UIImage imageWithCGImage:getImage(CGColorGetPattern(cColor.CGColor))]); 

    NSLog(@"Should be true: %d",[aImageData isEqual:bImageData]); 
    NSLog(@"Should be false: %d",[aImageData isEqual:cImageData]); 
} 

你可能穿上」不想訪問生產應用程序中的任何私有API,但這可能對測試有用。

使用關聯參考

如果這將在App Store則更好的解決方案可以爲UIColor要創建一個類別,並給它一個關聯參考存儲模式的名稱或任何最容易給你作比較。這根本不會比較實際圖像,因此如果您沒有設置正確的數據來識別圖案,則比較結果可能不準確。

包含頭:

#import <objc/runtime.h> 

創建類別:

@interface UIColor(CustomPatterns) 
@property (strong, nonatomic) NSString* patternName; 
@end 

@implementation UIColor(CustomPatterns) 

static char CUSTOM_PATTERNS_PATTERN_NAME_KEY; 

@dynamic patternName; 

-(void)setPatternName:(NSString *)patternName 
{ 
    objc_setAssociatedObject(self, &CUSTOM_PATTERNS_PATTERN_NAME_KEY, patternName, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

-(NSString *)patternName 
{ 
    return (NSString*)objc_getAssociatedObject(self, &CUSTOM_PATTERNS_PATTERN_NAME_KEY); 
} 

@end 

然後你就可以設置自定義的數據和比較:

爲`UIColor`
-(void)comparePatterns 
{ 
     UIColor *aColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"1"]]; 
     aColor.patternName = @"1"; 

     UIColor *bColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"1"]]; 
     bColor.patternName = @"1"; 

     UIColor *cColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"2"]]; 
     cColor.patternName = @"2"; 

     NSLog(@"Should be true: %d",[aColor.patternName isEqualToString:bColor.patternName]); 
     NSLog(@"Should be false: %d",[aColor.patternName isEqualToString:cColor.patternName]); 
}