比较[UIColor colorWithPatternImage:]

时间:2015-06-18 18:51:24

标签: ios uicolor

我想比较我使用[UIColor colorWithPatternImage:]生成的两个UIColor是否相等。我似乎无法弄清楚如何做到这一点。

[[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";
    }
    ...
}

这只是一件疯狂的事吗?我想我可以创建自己的具有color属性和colorName属性的对象......

1 个答案:

答案 0 :(得分: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

然后您可以设置自定义数据并进行比较:

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