iOS 应用的 Theme 开发

今天终于把去年想做的一件事搞定: 完成新版Theme管理组件并开源。

这是我第一次做主题管理开发。所以先网上了解了下,普遍做法是把主题相关的图片资源放在一个文件夹,再用的时候通过切换不同的文件夹来实现主题切换。

而在公司的项目里,同事换了一个思路,他给每个主题建了一个plist文件。在plist为保存图片名和其对应的Key。这样,相同的Key在不同的plist可以对应不同的图片,然后就通过换plist文件来换主题。plist的好处是还可以保存不同主题的颜色值,字体大小等信息。

但是呢,在使用的时候发现这个方案有以下缺陷:

  1. 增加一个新图片,就要到每个主题的plist里添加一下对应的key;
  2. 在我们的项目里,几个主题之间只是有一部分的区别,这样新建主题的时候需要从其他主题里先把相同的值全复制过来,然后再改;
  3. 图片没有分文件夹,导致同一个Key在不同主题下对应的图片资源放在一起有命名上的麻烦,时间长了难管理。

看到这些问题后,我做了第一步改进是设置了一个Base Theme,把几个主题里相同的东西抽出来,放在这里。其他主题只留不一样的。在读取资源的时候先看当前主题,没找到就去Base Theme找。

但再一想,主题多了的话,每个主题的base部分可能不一样。于是我又想到了继承。即主题可以设置一个父主题。这样当在这个主题没找到资源的话,就去父主题找。

同样的道理,对于Color、Font这些,也是一样的道理。不同的Key对应的值也可能是一样的。于是我改成颜色的Key可以指定和其他的某个Key一样就行,组件会自己找过去。

最后对于图片资源问题,我不再往plist里添加了。我把所有主题资源按照bundle来管理,然后用文件名来做Key。这样很轻巧的同时解决图片管理问题。

Bundle加主题继承合在一起,就能使每个主题只增加自己想改的部分,大大减少了创建新主题的工作量。

最后,按照以上思路,新版主题管理终于完成!这个组件叫AWLThemeManager,已经放到CocoaPods上了。欢迎大家拍砖。

2015/3/12 22:16 下午 posted in  iOS