2

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

这是我在设置按钮和图标的图像时当前使用的代码

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

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

4

2 回答 2

2

当然,您可以在[UIImage imageNamed:[NSString stringWithFormat:@"%@/menuBtn.png", colourVar]]设置colourVar图像之前进行设置。

于 2013-08-08T10:42:04.267 回答
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 中设置的图像也将被替换。

于 2013-08-08T11:54:26.690 回答