阴影减慢 UIScrollView

Posted

技术标签:

【中文标题】阴影减慢 UIScrollView【英文标题】:Shadows slow up UIScrollView 【发布时间】:2015-06-02 16:35:03 【问题描述】:

我有一个UIScrollView,它的功能几乎类似于 Facebook 新闻提要。我认为我的元素正在减慢滚动 fps。通过消除过程,我发现 阴影会减慢我的应用程序。

滚动视图内的UIView 框有这样的配置:

self.layer.shadowColor = UIColor.blackColor().CGColor
self.layer.shadowOffset = CGSizeMake(0, 2)
self.layer.shadowRadius = 2
self.layer.shadowOpacity = 0.15

就像新闻提要一样,我的滚动视图有很多框,因此UIViews 有自己的阴影。如何在不减慢应用速度的情况下进行此操作?

【问题讨论】:

self.layer.shouldRasterize = YES; 它奏效了,而且确实加快了速度。然而,所有的子视图(主要是UILabels)都变得模糊了。 【参考方案1】:

有很多关于加速 UIScrollViews 的东西:

CALayer - Shadow causes a performance hit? https://markpospesel.wordpress.com/2012/04/03/on-the-importance-of-setting-shadowpath/

如果你使用自定义 CALayer 实例——尤其是阴影——需要处理能力的东西,你应该使用

scrollView.layer.shouldRasterize = YES;
scrollView.layer.rasterizationScale = [UIScreen mainScreen].scale;

shadowPath 也可以加快您的滚动视图,如下所示:

[scrollView.layer setShadowPath:[[UIBezierPath bezierPathWithRect:myView.bounds] CGPath]];

设置 shadowPath 允许 ios 在每次绘制视图时无需重新计算应如何绘制阴影,从而提高性能。

很快,像这样:

let shadowPath = UIBezierPath(rect: view.bounds);
view.layer.masksToBounds = false;
view.layer.shadowColor = UIColor.blackColor().CGColor;
view.layer.shadowOffset = CGSizeMake(0, 0.5);
view.layer.shadowOpacity = 0.2;
view.layer.shadowPath = shadowPath.CGPath;

【讨论】:

你说.shouldRasterize.rasterizationScale够了吗?您能否也为该代码编写一个 Swift 等效项(尤其是 setShadowPath 行)?谢谢!【参考方案2】:

设置shadowPath 将提高性能并且只要您的视图是不透明的,看起来就一样。您可以将其设置为视图或图层的边界,如下所示:

CGPathRef shadowPath = CGPathCreateWithRect(self.bounds, NULL);
self.layer.shadowPath = shadowPath;
CGPathRelease(shadowPath);

在斯威夫特中:

layer.shadowPath = CGPathCreateWithRect(bounds, nil)

内存管理为你处理(讨论here)。

【讨论】:

你能写一个等效的 Swift 吗?尤其是CGPathRelease这一行。谢谢!

以上是关于阴影减慢 UIScrollView的主要内容,如果未能解决你的问题,请参考以下文章

为啥程序背景会减慢 UIScrollView?

如何“减慢” MIDI 文件(最好在 Python 中)?

减慢 UIDynamicAnimator 的动画

需要将执行速度减慢至少 5 秒

无法在 ios 中减慢动画速度

非聚集索引会减慢插入速度吗?