如何在iOS应用中切换外观(或设计主题)?

我想让我的iPhone应用程序能够在皮肤(或设计主题,或外观和感觉,如木制,金属,地球颜色,男士,女士等等)之间切换。

我将准备一些包含按钮和背景图像,声音和文本颜色的皮肤,并让用户决定应用程序设置使用哪组皮肤。

实施这个的最佳做法是什么?

条件是:

  • 我想使用Interface Builder
  • 我需要支持iOS 3.1.3及更高版本
  • 我想从网上下载皮肤套装(我无法在应用中捆绑所有皮肤,因为一套皮肤需要大量图像,如果我这样做,应用程序文件大小可能会变得很大......我也不想硬编码有关特定皮肤的任何信息。)
  • 如果自定义皮肤不包含一个或一些元素(如图像或声音文件),我希望它使用默认皮肤集中的缺少元素。
  • 我不想为每个皮肤创建Nib文件。 一个屏幕的Nib文件应该是主包中唯一的一个,以便于维护。
  • 我正在考虑在应用程序中创建所有UIViewController的超类,并覆盖它加载Nib文件的部分,而不是从主包加载,从保存在Document目录中的皮肤加载资源...但我不知道该怎么做...... Nib加载方法的默认行为总是从主包中加载资源,并且有关资源文件名的信息在阅读...... :(

    在此先感谢您的帮助。


    我不确定最佳做法..但是,如果你的应用程序不够大,那么一个结构良好的plist就是你的朋友。

    最初,您可以选择:金属主题。 以下内容应该保留:

    你可以有一个Singleton ThemeManager ,或者在适当的时候将一个NSDictionary粘贴到你的一个Singleton上。

    ThemeManager背后的要点是资产和主题之间的映射。

    一些示例代码(直接写在SOF上..不介意语法错误):

    #define kThemeMap(__x__) [[ThemeManager sharedManager] assetForCurrentTheme:__x__]
    
    ...
    
    -(void)doUselessStuff {
        UIImage* backgroundImage = [UIImage imageNamed:kThemeMap(@"FirstViewBG")];
    
        ...
    
    }
    
    //in the ThemeManager:
    //returns the appropriate name of the asset based on current theme
    -(NSString*)assetForCurrentTheme:(NSString*)asset {
        //_currentTheme is an NSDictionary initialized from a plist. Plist can be downloaded, too.
        NSString* newAsset = [_currentTheme objectForKey:asset];
        if(newAsset == nil) {
            newAsset = [_defaultTheme objectForKey:asset];
        }
        return asset;
    }
    
    //Let us assume the user selects Metal Theme somewhere .. Still coding ThemeManager:
    -(void)selectedNewTheme:(NSString*)newTheme {
        //First, get the full path of the resource .. Either The main bundle, or documents directory or elsewhere..
        NSString* fullPath = ...;
        self.currentTheme = [NSDictionary dictionaryWithContentsOfFile:fullPath];
    }
    

    plist文件只是一个字符串到字符串映射的字典......类似这样:

    //Default.plist
    @"FirstViewBG"  : @"FirstViewBG_Default.png"
    @"SecondViewBG" : @"SecondViewBG_Default.png"
    @"WinSound"     : @"WinSound_Default.aiff"
    
    //Metal.plist
    @"FirstViewBG"  : @"FirstViewBG_Metal.png"
    @"SecondViewBG" : @"SecondViewBG_Metal.png"
    @"WinSound"     : @"WinSound_Metal.aiff"
    

    或者,你可以保存后缀,如果这对你来说足够好。但是,它需要字符串操作,通过切分扩展名 - >添加后缀 - >添加扩展名。

    或者,也许让它成为一个前缀?


    您可以使用方法化的imageNamed:对UIImage进行分类,使用自定义的imageNamed:而不是默认的。 在自定义方法中,按主题选择图像。

    链接地址: http://www.djcxy.com/p/55837.html

    上一篇: How to switch skins (or design themes) in iOS app?

    下一篇: Algorithm for sorting people into rooms based on age and nationality