所以我在导航控制器上做了一些自定义动画,以及它推动和弹出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并且仍然很慢
答案 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