应用程序动态选择要使用的图标/图像

时间:2013-08-08 10:37:44

标签: iphone ios objective-c

我正在创建一个能够将其UI主题切换为不同颜色(包括图标)的应用程序。我计划将不同的图标集存储在不同的文件夹(绿色文件夹,黄色文件夹等)中。所有文件夹中图标的名称都是相同的,唯一会改变的是它的颜色。

以下是我在设置按钮和图标的图像时正在使用的代码

[menuBtn setBackgroundImage:[UIImage imageNamed:@"menuBtn.png"] forState:UIControlStateNormal]

例如,如果用户选择黄色作为应用主题。在内部将有某种开关,它将为图像ex选择路径。当用户选择黄色时,上面的代码将评估为“yellow / menuBtn.png”,当用户选择绿色时,将评估为“green / menuBtn.png”。这可能吗?

2 个答案:

答案 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中设置的图像也将被替换。