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

2024-03-23

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

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

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

条件是:

  • 我想使用界面生成器
  • 我需要支持 iOS 3.1.3 及更高版本
  • 我想让这些皮肤集可以从互联网下载(我无法将所有皮肤捆绑在应用程序中,因为一组皮肤需要大量图像,如果这样做,应用程序文件大小可能会变得很大......我也不想硬编码有关特定皮肤的任何信息。)
  • 如果自定义皮肤不包含一个或某些元素(例如图像或声音文件),我希望它使用默认皮肤集中缺少的元素。
  • 我不想为每个皮肤创建 Nib 文件。一个屏幕的 Nib 文件应该是主包中唯一的文件,以便于维护。

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

在此先感谢您的帮助。


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

最初,您可以选择:金属主题。应满足以下条件:

你要么有一个单例ThemeManager,或者只是粘贴一个NSDictionary如果合适的话,发送给您的单身人士之一。

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"

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

或者也许将其作为前缀?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在iOS应用程序中切换皮肤(或设计主题)? 的相关文章

  • 启动使用 Simperium 的应用程序时 objectFromJSONString 崩溃

    我得到了一个JSON当我尝试启动使用 Simperium 框架的应用程序时崩溃 NSCFString objectFromJSONString unrecognized selector sent to instance 0x6c561a0
  • 基于 ID 的 UiLocalNotifications

    是否有关于根据那里的 Id 存储 UIlocalNotifications 并根据那里的 Id 取消通知的教程 在本地通知中 您有此词典的用户词典 您可以取消通知 http www picksourcecode com ps ct 1612
  • 在 iOS 8 中创建通话/双高状态栏?

    是否有调用自定义通话 双高状态栏的标准方法 如果没有 那么构建我自己的功能的最佳起点是哪里 我知道关于如何做到这一点存在一些多年的问题 但没有任何令人满意的答案 有什么新方法可以做到这一点吗 可能在 iOS 8 中 这里没有什么新鲜事 但我
  • 将 Xcode 4.5 新 XIB 文件恢复到 iOS<6

    我已经安装了Xcode 4 5 with iOS6 SDK以及其他用于测试目的的旧 SDK 从 4 3 到 6 0 很美 但是有一个BIG问题 生成一个新的 XIB 文件以兼容 iOS6 这是一个问题 因为我的应用程序需要运行在旧设备 不只
  • NSString 到 NSDate 的转换得到错误的结果[重复]

    这个问题在这里已经有答案了 可能的重复 NSDateFormatter 的时间错误 https stackoverflow com questions 5466419 wrong time from nsdateformatter NSDa
  • 具有透明背景的 Swift 模态视图控制器 [重复]

    这个问题在这里已经有答案了 我知道这个话题很受欢迎 但我在编程语言中遇到了一些问题 事实是我仍然不明白我把代码放在哪里 好吧 我就来说说整个案子 我正在尝试制作一个与正常情况稍有不同的模态 Swift 通过单击按钮 ViewControll
  • 如何在 iOS 中设置视图的最大宽度?

    我的应用程序有一个基本的登录屏幕 一个外框以及其中的一些文本字段和按钮 我将框设置为填满屏幕 然而 在某些设备上这个盒子会太大 如何设置视图的最大宽度和高度 您可以使用自动布局约束 使框适应屏幕尺寸 但不超过给定的宽度和高度 为此 请对宽度
  • 在 UIView 中绘制彩色文本 -drawRect: 方法

    我正在尝试在我的中绘制彩色文本UIView子类 现在我正在使用单视图应用程序模板 用于测试 除了以下内容外 没有任何修改drawRect method 文本已绘制 但无论我将颜色设置为什么 它始终是黑色的 void drawRect CGR
  • Xcode 11 无法识别静态库的架构:MacCatalyst(又名 UIKitForMac)

    在对 2019 年 WWDC 公告感到兴奋之后 我尝试使用 Xcode 11 0 beta 针对 MacOS 编译现有的 iOS 应用程序 不幸的是 事情并没有按预期进行 Xcode 说我的静态库是为 架构构建的 为 Mac 版 UIKit
  • 如何检测 iOS 8 上的包含应用程序是否启用了应用程序扩展?

    我正在 iOS 8 beta 上开发一个自定义键盘 我想告诉用户如果我的自定义键盘未启用 如何在包含应用程序中启用它 有什么方法可以检测应用程序扩展是否已启用 首先让我们设置一些常量 以便于彼此理解 包含应用程序 安装扩展并保存扩展二进制文
  • 无法识别的选择器调用静态 iOS 库中的类别方法

    我正在使用一些第三方软件来帮助使用 Xcode 4 3 2 编写 iPad 应用程序 该软件是开源的 通常经过设置 因此其代码将与开发人员为应用程序编写的任何代码一起编译 因为我在很多地方使用该软件 所以我决定将其构建为 iOS 模拟器的静
  • 如何从 UILabel 创建图像?

    我目前正在 iPhone 上开发一个简单的类似 Photoshop 的应用程序 当我想要展平图层时 标签位于良好的位置 但字体大小不佳 这是我要展平的代码 UIGraphicsBeginImageContext CGSizeMake wid
  • iOS JPEG 图像旋转 90 度

    我正在使用选择器视图从相册中选择图像 我使用上面的代码 void imagePickerController UIImagePickerController picker didFinishPickingMediaWithInfo NSDi
  • TableView 中图像的大小不正确

    我正在使用来自 URL 的图像创建一个表视图 但图像不会调整到所有视图的大小 直到我将其按入行中 知道为什么会发生这种情况吗 这是一个自定义的表格视图 我的代码是 UITableViewCell tableView UITableView
  • 如何在iphone APP中下载facebook和Picasso的图片

    任何人告诉我有关 iphone 中从 facebook 和 picassa 下载图像的功能 我正在其中制作应用程序 我想制作通过我的应用程序从 picassa 和 facebook 下载选定图像的功能 那么我必须做什么 谢谢 查看NSURL
  • 在 C# Winforms 应用程序中嵌入 Windows XP 主题

    我有一个旧版 C Windows 窗体应用程序 其布局是根据 Windows XP 默认主题设计的 由于需要将其作为 Citrix 应用程序进行分发 该应用程序现在看起来像经典主题应用程序 因为 Citrix 不鼓励使用主题系统服务 所以
  • 如何像谷歌日历一样将单元格的内容滚动到表格视图中的另一个单元格中?

    我希望用户界面像谷歌日历那样进入桌面视图 它在不同的行中显示相同的日期事件 但是当您向上或向下滚动时 左侧的日期也会向上向下滚动 Can you please help me how to achieve this Please take
  • 如何检测 UISearchBar/UITextField 输入中的暂停?

    我有以下 UISearchbar 代码 void searchBar UISearchBar searchBar textDidChange NSString searchText UIApplication sharedApplicati
  • 在iOS中设置框架的原点

    我正在尝试以编程方式设置框架的原点 Method1 button frame origin y 100 方法二 CGRect frame button frame frame origin y 100 我尝试了方法 1 但它不起作用 显示错
  • 我如何用 javascript/jquery 进行两指拖动?

    我正在尝试创建当有两个手指放在 div 上时拖动 div 的功能 我已将 div 绑定到 touchstart 和 touchmove 事件 我只是不确定如何编写这些函数 就像是if event originalEvent targetTo

随机推荐

  • Emacs 确定键盘布局

    Emacs 有没有办法检测当前的键盘布局 我经常用英语和德语写文本 切换 Win 操作系统 键盘布局 但是 某些功能 例如 C Y 应始终位于相同的物理键上 无论我当前使用哪种语言进行输入 Thanks 考虑使用M x set input
  • 使用 Firebase 和 APNs 身份验证密钥进行生产推送通知

    在 TestFlight 上测试我的应用程序时 我注意到我没有收到推送通知 我已确认 当从 Xcode 加载构建时 我可以收到从云函数和 firebase 控制台发起的通知 我引用了其他类似的问题 但没有一个反映我正在处理的确切问题 在 F
  • 如何将文件保存到 MongoDB?

    我想将用户选择的文件保存到 MongoDB 如何正确地将文件添加到 BSON 对象以便将其添加到 MongoDB 如果我的方法不正确 请指出正确的方向 下面是客户端代码 此 jQuery 函数收集每个输入字段上的文本 需要文件部分的帮助 并
  • Spring Boot 几分钟后停止解析视图

    我有一个 Spring Boot 应用程序 它突然停止解析视图 而是向我抛出 404 错误 这些是我的依赖项
  • 如何从代码隐藏中确定 ASP.NET 生成的 ID?

    在 ASP NET 中 当您为标签提供 ID 时 它会根据控件层次结构为该元素生成唯一的 HTML id 即
  • 如何在未聚焦时保持 WPF 文本框选择?

    我想在 WPF TextBox 中显示一个选择 即使它没有焦点 我怎样才能做到这一点 我已将此解决方案用于 RichTextBox 但我认为它也适用于标准文本框 基本上 您需要处理 LostFocus 事件并将其标记为已处理 protect
  • d3 强制定向图删除文本光标

    当我向 d3 力定向图形布局中的节点添加文本时 当我将鼠标悬停在该节点上时 鼠标指针会更改为文本光标 有没有办法避免这种情况并始终让它保持常规指针 普通指针 文本光标 这是一个fiddle http jsfiddle net pkerped
  • 在哪里可以找到 Java API 代码[重复]

    这个问题在这里已经有答案了 我听说Java是开源代码 那么 我可以获得 Java API 编码方法吗 如果是这样 请告诉我在哪里可以获取 Java API 的源代码 您可以在src zip在JDK安装目录下 From Java docs h
  • 使用应用程序中存储的图像的本地路径将 Web 应用程序加载到 Web 视图中

    我希望能够创建一个使用 WebView 请求 url 的应用程序 从外部 Web 应用程序返回 html 和 css 引用作为实际应用程序中的资产的图像 这 想法基本上是加速一切 以便图像永远不必 被下载 这是一个简化的示例 服务器 HTM
  • 不考虑锁的文件只读访问 (C#)

    如何打开 使用 C 已打开的文件 例如在 MS Word 中 我想如果我打开文件进行读取访问 例如 FileStream f new FileStream filename FileMode Open FileAccess ReadWrit
  • 如何知道分数中的循环小数?

    我已经知道分数何时是重复小数 这是函数 public bool IsRepeatingDecimal get if Numerator Denominator 0 return false var primes MathAlgorithms
  • Tradingview Pine-Script:如何仅绘制最后 x 个周期

    我只想绘制最后 x 个周期的指标 我怎么做 如果我可以进行时间操作 从plotStartDate中减去x period 也许我可以使用以下代码 period timeframe ismonthly or timeframe isweekly
  • SPLoginViewController 用于记住凭据

    在 CocoaLibSpotify 中 如何让 SPLogin ViewController 存储凭据 以便用户稍后可以通过 PSSession sharedSession attemptsLogin WithStoredCredentia
  • Laravel 5.5 使用自定义消息进行验证

    我正在我的 laravel 应用程序中处理密码更改表单 我想将验证器与自定义错误消息一起使用 我的代码如下所示 rules username gt required max 255 oldpassword gt required max 2
  • 与模块相比,使用具有静态函数的类有什么优势吗?

    我想要一些建议 我正在使用打字稿来创建对话框 一旦创建 它们就会自行处理 因为它们有自己的提交按钮并进行自己的检查 以下两种编码方式有什么优点或缺点吗 到目前为止 我唯一能看到的是 带有导出的模块方法允许我隐藏一个函数 并在不导出它的情况下
  • 如何更改 bookdown pdf 中的字体和磅值?

    我正在写一个文档 严格要求使用arial 12点 我在 bookdown 中修改了输出 yml 如下所示 site bookdown bookdown site fontsize 12pt fontfamily arial document
  • 水豚 fill_in 只适用于字段 id,为什么?

    在运行我的 rspec 测试时 我收到错误 Capybara ElementNotFound 无法找到字段 名字 我的rspec测试如下 describe with valid information do before do puts p
  • android:动态列表视图焦点每次从其他项目失去焦点后都会返回第一个项目

    我使用两个列表视图的 list A 和 list B 它们具有相同数量的列表项 如图 1 所示 其中 list B 是自定义数组适配器 其中每个项目作为列表 字符串 动态创建所需宽度的按钮 public class LarrayAdapte
  • 用python求解非方矩阵:如何使用numpy.linalg.lstsq()?

    要求的行为 我想用 python 求解非方矩阵 该矩阵具有两个线性相关向量 当前状态 我尝试使用numpy linalg solve 首先 但这仅适用于方阵 其他推荐使用的 StackOverflow 帖子numpy linalg lsts
  • 如何在iOS应用程序中切换皮肤(或设计主题)?

    我想让我的 iPhone 应用程序能够在皮肤 或设计主题 或外观和感觉 如木质 金属 大地色 男士 女孩等 之间切换 我将准备一些皮肤组 其中包含按钮和背景的图像 声音和文本颜色 并让用户通过应用程序设置决定他们想要使用哪组皮肤 实现这一点