【问题标题】:Application dynamically choosing which icons/images to use应用程序动态选择要使用的图标/图像
【发布时间】:2013-08-08 20:19:38
【问题描述】:

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

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

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

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

【问题讨论】:

标签: iphone ios objective-c


【解决方案1】:

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

【讨论】:

  • 嗨,这是唯一的方法吗?因为如果我使用这种方法,我有很多图像和代码将被修改。我在想可能有一些内部开关,我可以在其中指定默认位置。这样我在代码中指定的“homeBtn.png”可以指向不同的位置,而无需修改代码。
【解决方案2】:

如果您不想修改现有代码,可以编写一个类别,它将在运行时替换图像的名称,初始阶段可以是这样的:

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

【讨论】:

    猜你喜欢
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    相关资源
    最近更新 更多