静态渐变图像与 CAGradientLayer?

Posted

技术标签:

【中文标题】静态渐变图像与 CAGradientLayer?【英文标题】:Static Gradient Image vs CAGradientLayer? 【发布时间】:2016-05-26 01:03:51 【问题描述】:

我需要在应用程序中显示一些渐变背景,目前我的想法有两种选择,一种是使用静态渐变图像,另一种是使用CAGradientLayer,我正在努力选择他们。

我只需要在渐变中设置三个色标,顶部、中间和底部,所以这两种方式都是直截了当的,我主要关心的是渲染速度,下降到[UIImage imageNamed:@"gradient-image.png"] vs CGGradientLayer。静态图像可以保留在内存中,因此它只加载一次,但是对于不同的屏幕,要么缩放单个图像,要么我必须有不同大小的图像,这会增加应用程序的整体大小。

我不知道有没有文章或结论关于每种方法的优缺点,通常应该首选哪一种?

谢谢!

【问题讨论】:

【参考方案1】:

如果必须按比例缩小图像,则会造成大量内存浪费。如果图像的大小正好适合屏幕尺寸和屏幕分辨率,则图像和渐变层之间在运行应用程序中没有内存差异,因为渐变层具有相同的后备存储大小正确的图像的大小。但考虑到可能的分辨率和屏幕尺寸的巨大数量,这是一个非常高的要求,当然它会大大增加应用程序本身的大小

由于这些原因,我认为渐变层是首选。最好为设备提供绘图的指令,而不是提供绘图的实际 - 除非,如您所说,存在渲染时间问题.

现在,我从未发现渐变层的任何“渲染速度”问题,我认为担心这是过早优化的情况。此外,从应用程序加载图像也需要时间。可能出现问题的地方是,如果您这样做是为了形成表格视图的各个单元格的背景,例如,每个单元格必须在用户滚动时实时构建。但是如果 Instruments 发现图像更好,那么在这种情况下,我仍然将代码中的渐变绘制成完美尺寸和分辨率的图像,但我会将图像保留在记忆并从中构建细胞。

【讨论】:

考虑如何渲染渐变。如果它只是线性渐变,那么使用图像并应用scaleToFill 将导致渐变看起来与在代码中创建它完全相同。如果渐变是类似径向的形状,那么您最终可能会得到椭圆渐变而不是圆形渐变,但即便如此,aspectFill 也会产生与使用新尺寸代码绘制相同的结果。

以上是关于静态渐变图像与 CAGradientLayer?的主要内容,如果未能解决你的问题,请参考以下文章

如何增加色彩空间CAGradientLayer

swift渐变之CAGradientLayer

CAGradientLayer 没有正确绘制渐变

如何为图像添加渐变?

CAGradientLayer颜色渐变器

CAGradientLayer 径向渐变