我想比较我使用[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属性的对象......
答案 0 :(得分:1)
这需要对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]);
}