向单元格添加阴影会导致延迟滚动

时间:2012-07-31 04:50:48

标签: iphone objective-c ios ipad uiview

所以我有一个有阴影的UIView:

[containerFrame.layer setShadowOffset:CGSizeMake(0, 1)];
[containerFrame.layer setShadowRadius:4.0];
[containerFrame.layer setShadowColor:[UIColor colorWithRed:34/255.f green:25/255.f blue:25/255.f alpha:1.0].CGColor];
[containerFrame.layer setShadowOpacity:0.4];

有了这个,我的滚动FPS下降到20-30。移除阴影然后繁荣,我的FPS回到60并且滚动像黄油一样光滑。现在的问题是我需要在这个盒子/容器视图周围有一个阴影效果。如何在不降低滚动速度的情况下实现这一目标?

2 个答案:

答案 0 :(得分:16)

尝试设置阴影路径:

[containerFrame.layer setShadowOffset:CGSizeMake(0, 1)];
[containerFrame.layer setShadowRadius:4.0];
[containerFrame.layer setShadowColor:[UIColor colorWithRed:34/255.f green:25/255.f blue:25/255.f alpha:1.0].CGColor];
[containerFrame.layer setShadowOpacity:0.4];

// New line
[containerFrame.layer setShadowPath:[UIBezierPath bezierPathWithRect:containerFrame.bounds].CGPath];
  

如果你必须为这个视图设置动画(特别是如果它是a的一部分   UITableViewCell)你可能会注意到动画中的断断续续。   这是因为计算视图的阴影需要   Core Animation做一个offscreen渲染传递来确定   确切的视图形状,以便弄清楚如何渲染它的下降   阴影。 (请记住,您的视图可能是任何复杂的形状   即使有洞也可以。)

来自On the importance of setting shadowPath

答案 1 :(得分:1)

设置containerFrame.layer.shouldRasterize = YES;它减慢的原因是因为计算阴影是昂贵的。光栅化会将视图折叠成图像,因此速度会快得多。