5

所以我有一个有阴影的 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,滚动就像黄油一样顺畅。现在的问题是我需要在这个盒子/容器视图周围有一个阴影效果。如何在不减慢滚动速度的情况下实现这一目标?

4

2 回答 2

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];

如果您必须对此视图进行动画处理(尤其是如果它是 UITableViewCell 的一部分),您可能会注意到动画中的卡顿。这是因为计算视图的投影需要 Core Animation 进行屏幕外渲染,以确定视图的确切形状,以便确定如何渲染其投影。(请记住,您的视图可以是任何复杂的形状,甚至可能带有孔。)

关于设置 shadowPath 的重要性

于 2012-07-31T04:58:37.540 回答
1

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

于 2012-07-31T04:59:57.800 回答