我正在创建一个能够将其UI主题切换为不同颜色(包括图标)的应用程序。我计划将不同的图标集存储在不同的文件夹(绿色文件夹,黄色文件夹等)中。所有文件夹中图标的名称都是相同的,唯一会改变的是它的颜色。
以下是我在设置按钮和图标的图像时正在使用的代码
[menuBtn setBackgroundImage:[UIImage imageNamed:@"menuBtn.png"] forState:UIControlStateNormal]
例如,如果用户选择黄色作为应用主题。在内部将有某种开关,它将为图像ex选择路径。当用户选择黄色时,上面的代码将评估为“yellow / menuBtn.png”,当用户选择绿色时,将评估为“green / menuBtn.png”。这可能吗?
答案 0 :(得分:2)
当然,您可以在设置图片之前执行[UIImage imageNamed:[NSString stringWithFormat:@"%@/menuBtn.png", colourVar]]
并设置colourVar
。
答案 1 :(得分:0)
如果您不想修改现有代码,可以编写一个类别,该类别将在运行时图像名称替换,在初始阶段它可以是这样的:
@implementation UIImage (replacementImage)
+ (void) load {
Method fontWithName_size_ = class_getClassMethod([UIImage class], @selector(imageNamed:));
Method replacementFontWithName_size_ = class_getClassMethod([UIImage class], @selector(replacement_imageNamed:));
if (fontWithName_size_ && replacementFontWithName_size_ && strcmp(method_getTypeEncoding(fontWithName_size_), method_getTypeEncoding(replacementFontWithName_size_)) == 0)
method_exchangeImplementations(fontWithName_size_, replacementFontWithName_size_);
}
+ (UIImage *)replacement_imageNamed:(NSString *)name {
NSString *currentLocation = #YOUR_CURRENT_IMAGES_LOCATION#;
NSString *replacementImageName = [currentLocation stringByAppendingPathComponent:name];
return [self replacement_imageNamed:replacementImageName];
}
@end
但它只替换方法imageNamed的实现,这可能是不够的,你需要替换一些其他方法。我没有对此进行测试,因此可能需要添加一些调整。检查图像是否存在于当前位置也是有用的,如果不存在则在另一个位置搜索。
通过这种方法,在IB中设置的图像也将被替换。