序
因为接触到一些 BaseUI 的设计,所以想开一篇文章探讨一下,怎么样的 BaseUI 才是一个好的设计。
预想到的有几种:
- 继承,使用继承来实现不同的样式
- 扩展,使用扩展来给 UI 控件添加样式
同时,也要考虑动态切换的可能性,根据选择的不同主题直接切换,例如黑色和白色主题的切换等…还有,主题切换会带来更大的开销和更大的代码复杂度,还要权衡付出的代价和动态的程度。
- 简单:重新启动app的时候切换
- 中级:本地根据本地固有样式切换
- 骨灰:支持动服务端下载 json 进行切换
警告⚠️:本文是理论篇,没有代码。
Json
通过上面的讨论,最好的方式就是使用 Json 文件。引进 Json 有着良好的文件兼容性,还能作为文档方便的在项目之外传播和查看。
优势之一就是 Android 和 iOS 能用同一套文件。
优势之二就是通常解析比较方便。
序+
如果使用 Json 文件,还有一个好处就是能用脚本生成代码给不同项目使用:
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
orJson?
- 使用哪个数据库存储,速度更快?
这个部分还没有结论,所以暂时抛个问号在这里…
最后
本文大多理论结果和探求,没有干货。大家且看且思考一下~