BaseUI

关于 Theme 动态切换的一些研究

Posted by poos on January 21, 2020

因为接触到一些 BaseUI 的设计,所以想开一篇文章探讨一下,怎么样的 BaseUI 才是一个好的设计。

预想到的有几种:

  • 继承,使用继承来实现不同的样式
  • 扩展,使用扩展来给 UI 控件添加样式

同时,也要考虑动态切换的可能性,根据选择的不同主题直接切换,例如黑色和白色主题的切换等…还有,主题切换会带来更大的开销和更大的代码复杂度,还要权衡付出的代价和动态的程度。

  • 简单:重新启动app的时候切换
  • 中级:本地根据本地固有样式切换
  • 骨灰:支持动服务端下载 json 进行切换

警告⚠️:本文是理论篇,没有代码。

Json

通过上面的讨论,最好的方式就是使用 Json 文件。引进 Json 有着良好的文件兼容性,还能作为文档方便的在项目之外传播和查看。

优势之一就是 Android 和 iOS 能用同一套文件。

优势之二就是通常解析比较方便。

序+

如果使用 Json 文件,还有一个好处就是能用脚本生成代码给不同项目使用:

使用Swift编写脚本

UI 类

文章开头说的两种方案,继承 UI 类和使用 UIKit 的扩展。

更简单的方式应该是使用 继承,虽然简单,但是也是有好处的:

  • 看类名即可知道用的哪个 Theme
  • 可以跟 UIKit 的类区分开
  • 方便的在生命周期做一些其他的操作
  • 不会导致一个类的开放属性增多,造成误解

虽然继承好处很多,但是 扩展,往往也有很多地方有用:

  • 作为通用属性的扩展,例如添加 access identifier等
  • 一些系统 View 是确定的,例如 navBarItem,TabbarItem 等

动态性

  • 弱动态性

除了使用单一的 Theme,在 app 重新加载的时候进行刷新,其他方式动态切换的都需要使用 notification 或者 observer 来进行监听。

  • 随便动态性

为了项目支持动态性,往往要写大量的代码。只有提前准备好要执行的操作,才能在需要更换 Theme 的时候直接切换。

在父类上进行绑定,当 observer 收到消息执行 applyStyle() 改当前 theme,如果子类需要定制化,就重写 applyStyle() 即可。

还能够从服务器下载 json 文件,动态的使用和配置。简直666。

Theme+

当基础的 Font/Color 修改被完成后✅,大刀可能就指向了界面的约束。

例如在 app 的 Home页面,使用特殊的 json 文件切换,简直就像 APP 换了个衣服一样,虽然基本元素还在,但是位置,图片颜色甚至顺序都可以根据 json 来进行切换,简直完美!

代码设计和性能讨论

因为整个 Theme 是基于 Json,所以如果用户选择了从网络下载的Json文件,那么在 App 启动 的时候如何优化性能呢?

  • 存储什么样的格式在本地,Codeable or Json?
  • 使用哪个数据库存储,速度更快?

这个部分还没有结论,所以暂时抛个问号在这里…

最后

本文大多理论结果和探求,没有干货。大家且看且思考一下~