首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在iOS应用程序中切换皮肤(或设计主题)?

如何在iOS应用程序中切换皮肤(或设计主题)?
EN

Stack Overflow用户
提问于 2011-10-29 16:03:51
回答 2查看 7.9K关注 0票数 7

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

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

实现这一点的最佳做法是什么?

这些条件是:

  • 我想使用Interface
  • ,我需要支持iOS 3.1.3和后来的
  • ,我想让这些皮肤集可以从互联网下载(我不能将应用程序中的所有皮肤捆绑在一起,因为一组皮肤需要大量图像,如果这样做,应用程序的文件大小可能会变得很大……)我也不想硬编码任何有关特定皮肤的信息。)
  • 如果自定义皮肤不包含一个或一些元素(例如图像或声音文件),我希望它使用默认皮肤集中缺少的元素。
  • ,我不想为每个皮肤创建Nib文件。一个屏幕的Nib文件应该是主包中唯一的一个,以便更容易地实现maintenance.

我正在考虑用我的应用程序中的所有UIViewControllers创建一个超类,覆盖它加载Nib文件的部分,而不是从主包加载资源,而是从保存在文档目录中的皮肤加载资源.但我不知道怎么做..。Nib加载方法的默认行为总是从主包中加载资源,并且在阅读完资源文件名后,有关资源文件名的信息将丢失。:(

提前谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-29 16:51:01

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

最初,你可以选择:金属主题。应采取以下措施:

您要么拥有一个单例ThemeManager,要么在适当的情况下将一个NSDictionary粘贴到您的一个单件上。

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

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

代码语言:javascript
运行
复制
#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文件只是一个具有字符串到字符串映射的字典.就像这样:

代码语言:javascript
运行
复制
//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"

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

或者把它作为前缀?

票数 4
EN

Stack Overflow用户

发布于 2013-03-19 03:52:05

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7939981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档