Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone CALayer-阴影导致性能下降?_Iphone_Ios_Uinavigationcontroller_Calayer_Shadow - Fatal编程技术网

Iphone CALayer-阴影导致性能下降?

Iphone CALayer-阴影导致性能下降?,iphone,ios,uinavigationcontroller,calayer,shadow,Iphone,Ios,Uinavigationcontroller,Calayer,Shadow,所以我在navigationcontroller上做了一些自定义动画,以及它推动和弹出ViewController的方式 一切都很顺利。一旦我添加以下代码(在UINavigationController的子类中),我将面临巨大的性能损失。添加阴影后,所有动画都变得非常滞后。这是预期的还是我在代码中做了一些错误的事情 // This code gets called once during NavigationController initialization. [self.view setCli

所以我在navigationcontroller上做了一些自定义动画,以及它推动和弹出ViewController的方式

一切都很顺利。一旦我添加以下代码(在
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,但速度仍然很慢

是的,阴影非常昂贵(尤其是这么大的阴影——使用半径,你会注意到它会使你体验到的减速程度产生巨大的差异)。提高性能的一种方法是将其渲染一次到
CGImageContext
,然后只显示该图像,而不是让层在每次重画阴影时重新渲染阴影(但如果阴影需要动画或其他东西,这不起作用)。

您应该期待添加阴影的速度会减慢。阴影半径
为20非常高,速度特别慢

提高阴影渲染速度的另一个关键点是:设置属性。这会有很大的帮助

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

我最近遇到了一些关于缓慢的CALayer阴影的问题,这行简单的代码为我解决了所有问题

使用
阴影路径
而不是
阴影偏移

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

查看此帖子:

Swift 5.3。添加此代码

myView->UIView、collectionViewCell或tableViewCell可以是

我正在用“Neumorphism”风格编写应用程序,如此多的阴影和应用程序如此滞后。但使用下面的代码,应用程序非常流畅

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


你认为使用实际的png并将其添加到我的UIView会更好吗?如果有可能(即你事先知道阴影的形状/大小/任何内容),那么它肯定会给你更好的性能。闪电扫描图像比渲染阴影快得多。只要你不需要更改阴影形状,预渲染到图像就可以工作。设置阴影路径成功了,我的阴影半径为10,但仍然表现良好。@NicolasManzini阴影性能的更多提示:这是一种非常有效的测试方法。。。有了这个想法,工作就不应该像需要的那样快了。这个答案好多了!我不明白为什么@williamcotton answer会赢得这么多选票……暗影之路成功了。性能感觉好多了!太棒了,这使得它的性能更好,现在我可以有任何大小的阴影半径,而不需要性能测试。这将忽略你可能需要的视网膜图像。要解决此问题,请添加以下行:self.view.layer.rasterizationScale=[UIScreen mainScreen].scale;我在tableView中遇到了类似的问题,其中每个单元格都包含一些UILabel以及一个圆角视图。我在包含tableView的图层上添加了一个阴影,滚动变得不稳定。但是,设置shouldRasterize=YES解决了起伏问题,但将视图像素化(明显模糊),因此这不是一个可接受的解决方案。我发现使用“阴影路径”而不是“阴影偏移”可以达到效果。如果视图发生变化,效果可能会更糟。shouldRasterize=YES是视图不变时的唯一好解决方案,因此位图只生成一次,并由UIScrollViews缓存和重用。请注意,这会增加RAM使用量,效果非常好,比shouldRasterize模糊视图和所有子层要好。这是我测试的非常有效的方法。。。有了这个想法,工作就不应该像需要的那样快了。这个答案好多了!我不明白为什么@williamcotton answer会获得这么多选票…阴影路径非常好而且很快,但如何在自动布局中保持更新帧?只有在视图中没有圆角或透明度的情况下才可以。并不是每个视图都是矩形的
shouldRasterize
更通用,我们不必像上面所说的那样处理任何bezier路径。@TomSawyer在视图的布局子视图中这样做,也许您需要对一些视图进行子类化。这一点在WWDC 2010课程425:实践中的核心动画,第2部分中有明确介绍
viewHasShadow.layer.shouldRasterize = true
viewHasShadow.layer.rasterizationScale = UIScreen.main.scale