小背景:我正在开发一个iOS应用程序,它有各种状态的各种状态图标。这些图标用于各种地方和大小,包括UITableViewCell imageViews,自定义MKMapAnnotations和其他一些地方。我实际上有几个集合,其中包括一个更静态的状态图标,以及那些有动态文本注入到设计。
所以一开始我选择了使用静态栅格资产的传统路线,但因为尺寸是动态的,这并不总是最好的解决方案,我对使用CGAffineTransforms缩放的质量并不感到兴奋。所以我改变了一下方向,尝试了一些其他的东西:
- 为图标的每个高级类创建一个自定义UIView子类。它需要作为输入模型对象,从派生状态(我想我也可以只是使用一个枚举和加载到某种模型构造器,但这是我怎么做到的),所以它可以决定它需要绘制什么,然后在drawRect做必要的绘图。因为所有的绘图都是基于视图边界,所以它可以缩放到任何合理的尺寸。
- 创建一个类别,该类别具有类方法构造函数,可以接受模型输入以及您想要使用的大小,并构造自定义视图。
- 因为我也想要这些图标的栅格化版本的选项,以插入到某些地方(如UITableViewCell imageView),我还创建了构建视图的构造函数,并使用快速的iOS7快照功能返回一个UIImage。
这给了我什么?以下是我能看到的优点和缺点。
优点
- 完全可伸缩的图形,可以轻松地在各种不同的场景和上下文中使用。
- 易于兼容向图形(如文本)添加动态信息。因为我有我正在绘制的所有东西的确切形状数据,所以我不需要猜测文本框的边界,因为我知道所有东西是如何布局的。
- 与我可能想要栅格化资产的情况的兼容性,但我仍然得到动态视图的所有优点,因为我没有栅格化它,直到我需要它。
- 减少了应用程序的大小,因为我不需要包含栅格资产。
缺点
- 首先创建绘制代码的工作流程并不理想。对于简单的内容,我可以直接在代码中完成,但对于更复杂的内容,我需要在Illustrator或Sketch中创建矢量资产,然后将其导入PaintCode,并将生成的绘制代码清理成更精简的内容。这不是最理想的过程。
您可以尝试SVGKit,它绘制SVG文件,如果需要,可以导出到UIImage
。