1

在我的 iOS 应用程序中,我有一个需要进行动画处理、用手势转换、着色(使用阴影)和编辑。当我对此执行动画和手势时,UIView它非常“滞后”。iPhone 上的动画不是很“滞后”,但是当使用 iPad 时,动画几乎没有响应(到了我的应用程序崩溃的地步)。我已经使用 Instruments 测试了我的应用程序,并且在动画开始之前,该应用程序不会占用太多内存/CPU/电源。我已经在设备和 Intel i7 8GB iMac 上进行了测试,两者的动画都“滞后”。

我正在执行的动画并不复杂,它只是跨 X 轴的平移。在查看了与动画相关的每一行代码后,我发现这些行是问题所在:

viewer.layer.masksToBounds = NO;
viewer.layer.shadowOffset = CGSizeMake(-1, 1);
viewer.layer.shadowRadius = 3;
viewer.layer.shadowOpacity = 0.3;

上面的代码为视图添加了一个阴影,每当我对其进行动画处理时就会滞后(viewer)。如果我使用上面的代码,但我添加以下线条动画效果很好:

viewer.layer.shouldRasterize = YES;

这段代码的问题在于它严重降低了 UIView ( viewer) 内显示的内容的质量。这是shouldRasterize设置为 YES 的图像:

带有光栅化的 UIView

然后 UIView 没有shouldRasterize

没有光栅化的 UIView

这些屏幕截图都来自同一个 Retina iPad。

终极问题:我怎样才能在UIView有阴影的情况下流畅地执行动画(最好使用QuartzCore)?有没有办法在不降低质量的情况下对内容进行光栅化?

4

1 回答 1

3

在制作动画时,阴影属性CALayer可能非常低效,因为它需要根据图层的内容重新计算每一帧的阴影。幸运的是,代价高昂的部分是阴影路径计算,因此如果您只是创建一个CGPath表示内容的形状并将其分配给它,layer.shadowPath那么性能将会飙升。

由于您的图层似乎完全充满了不透明的数据,因此shadowPath非常简单:

layer.shadowPath = [UIBezierPath bezierPathWithRect:(CGRect){CGPointZero, layer.bounds.size}].CGPath;

唯一的缺点是,每当图层大小发生变化时,您都需要对其进行编辑。

于 2013-03-01T00:05:50.067 回答