gpt4 book ai didi

ios - 比较 [UIColor colorWithPatternImage :] 的相等性

转载 作者:行者123 更新时间:2023-11-29 12:20:01 24 4
gpt4 key购买 nike

我想比较使用 [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";
}
...
}

这只是一件疯狂的事情吗?我想我可以制作我自己的对象,该对象具有颜色属性和颜色名称属性...

最佳答案

使用私有(private) API

这对 CoreGraphics 进行了一些逆向工程,但我能够找到一个似乎返回图像的私有(private)方法 _CGPatternGetImage

您需要包含以下 header :

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

您可能不想访问生产应用中的任何私有(private) 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]);
}

关于ios - 比较 [UIColor colorWithPatternImage :] 的相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30923457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com