是的,是的,有……
如果你想要一个圆角半径和一个阴影,你不要打开-masksToBounds,而是设置圆角半径并用圆角矩形设置阴影的贝塞尔路径。保持两者的半径相同:
[layer setShadowOffset:CGSizeMake(0, 3)];
[layer setShadowOpacity:0.4];
[layer setShadowRadius:3.0f];
[layer setShouldRasterize:YES];
[layer setCornerRadius:12.0f];
[layer setShadowPath:
[[UIBezierPath bezierPathWithRoundedRect:[self bounds]
cornerRadius:12.0f] CGPath]];
在设置阴影路径后,您可能希望在不设置 -shouldRasterize 参数的情况下检查性能。设置阴影路径后,绘图性能往往会非常好。
更新
我已经有一段时间没有研究这个问题了,但您似乎不再需要设置 shadowPath 来使其正常工作。现在只需设置cornerRadius 和shadowOpacity 即可。我认为自 iOS5 以来就是这种情况(据我所知)。提供此更新可能是不必要的,因为将这些参数设置为“正常工作”,但我会为后代提供它。回顾一下,这就是您现在所需要的:
[layer setShadowOpacity:0.4];
[layer setCornerRadius:12.0f];
如果您仍然需要更好的性能,您可以继续设置shouldRasterize 参数:
[layer setShouldRasterize:YES];
说到性能,值得注意的是,如果您注意到动画缓慢,您毕竟会想要使用设置阴影路径的技术。这次更新真的只是为了指出不再需要设置路径来达到同时显示圆角半径和阴影的效果。但是,如果性能是您的首要任务,请使用路径。
更新 2
由于人们似乎在某些情况下无法使其正常工作,因此我将在此处从我创建的示例项目中发布更完整的代码 sn-p:
- (void)viewDidLoad
{
[super viewDidLoad];
CALayer *layer = [CALayer layer];
[layer setBounds:CGRectMake(0.0f, 0.0f, 100.0f, 200.0f)];
[layer setPosition:[[self view] center]];
[layer setBackgroundColor:[[UIColor lightGrayColor] CGColor]];
[layer setShadowOpacity:0.55f];
[layer setCornerRadius:8.0f];
[layer setBorderWidth:1.0f];
[[[self view] layer] addSublayer:layer];
[[[self testView] layer] setShadowOpacity:0.55f];
[[[self testView] layer] setShadowRadius:15.0f];
[[[self testView] layer] setCornerRadius:8.0f];
[[[self testView] layer] setBorderWidth:1.0f];
}
testView 是我在 Interface Builder 中添加的 UIView,并设置了一个出口。这是为了确保它在您显式添加的两个图层以及子视图中的图层上都可以正常工作。
我已经在 iOS5 到 iOS6.1 的模拟器上对此进行了测试。它在每个人中都为我提供了这个结果: