使用私有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]);
}
平等(創建從任何一種模式或RGB)都沒有很好的定義。通常,沒有理由比較顏色。如果你需要比較顏色,你做錯了什麼。 – Sulthan
@Sulthan當單元測試時,我測試顏色一點點。 – psobko