CALayer - 暗影导致性能下降?

时间:2012-04-03 17:02:40

标签: iphone ios uinavigationcontroller calayer shadow

所以我在导航控制器上做了一些自定义动画,以及它推动和弹出viewControllers的方式。

一切顺利。只要我添加以下代码(在UINavigationController的子类中),我就会遇到巨大的性能损失。添加阴影后,所有动画都变得非常迟钝。这是预期的还是我在代码中做错了什么?

// This code gets called once during NavigationController initialization.
[self.view setClipsToBounds:NO];
[self.view.layer setCornerRadius:5];
[self.view.layer setShadowOffset:CGSizeMake(0, 20)];
[self.view.layer setShadowColor:[[UIColor yellowColor] CGColor]];
[self.view.layer setShadowRadius:20.0];
[self.view.layer setShadowOpacity:1];

修改

将我的阴影半径更改为1并且仍然很慢

6 个答案:

答案 0 :(得分:83)

self.view.layer.shouldRasterize = YES;
self.view.layer.rasterizationScale = UIScreen.mainScreen.scale;

我最近遇到了缓慢CALayer阴影的问题,而这条简单的代码就为我修好了一切!

答案 1 :(得分:47)

你应该期望通过添加阴影来减速。 20 shadowRadius非常高,特别慢。

提高阴影渲染速度的另一个关键:设置shadowPath属性。它可以帮助很大。

答案 2 :(得分:15)

使用shadowPath代替shadowOffset

theView.layer.shadowPath = [UIBezierPath bezierPathWithRect:theView.bounds].CGPath;

查看此帖子:iphone - Animation's performance is very poor when view's shadow is on

答案 3 :(得分:2)

是的,影子是非常昂贵的(特别是一个很大的影子 - 与半径一起玩,你会注意到它会对你经历的减速程度产生巨大影响)。提高性能的一种方法是将其渲染一次到CGImageContext,然后只显示该图像而不是每次重绘时图层都重新渲染阴影(但如果阴影需要制作动画或东西)。

答案 4 :(得分:0)

迅速5.3。添加此代码。

myView-> UIView,collectionViewCell或tableViewCell都可以。

myview.layer.shadowPath = UIBezierPath(rect: cell.bounds).cgPath
myview.layer.shouldRasterize = true
myview.layer.rasterizationScale = UIScreen.main.scale

答案 5 :(得分:0)

我正在编写具有“新拟主义”风格的应用程序,阴影太多,应用程序如此滞后。但是用下面这个代码,app很流畅。

viewHasShadow.layer.shouldRasterize = true
viewHasShadow.layer.rasterizationScale = UIScreen.main.scale