是的,是有...
如果要同时具有拐角半径和阴影,你不打开- 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参数来检查你的表现。一旦你设置了阴影路径,绘图性能就会非常好。
UPDATE
我还没有看这个问题很长一段时间,但现在看来,你不再需要设置一个shadowPath
为了得到这个工作。只需设置cornerRadius
和shadowOpacity
即可使用。我认为iOS5以后就是这样(据我所知)。提供此更新可能是不必要的,因为设置这些参数“正常”,但我将为后人提供它。总括来说,这是现在所有你需要:
[layer setShadowOpacity:0.4];
[layer setCornerRadius:12.0f];
如果您仍需要更好的性能,你可以继续设置shouldRasterize
参数,以及:
[layer setShouldRasterize:YES];
和性能来讲,它的价值注意到如果你注意到呆滞的动画,你会希望使用设置阴影路径的技巧。此更新实际上只是指出,设置路径不再需要达到同时显示拐角半径和阴影的效果。但是,如果性能是您的首要任务,请使用路径。
- (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];
}
:
更新2
由于人们似乎遇到了麻烦这在某些情况下工作,我在这里从我创建了一个样本项目后更完整的代码片段
testView
是我在界面生成器中添加的一个UIView,并设置了一个插座。这是为了确保它在明确添加的两个图层以及子视图中的图层上都一样。
我已经在iOS5到iOS6.1的模拟器上测试了这个。它给出了这样的结果,我在他们每个人:
有什么理由不shouldRasterize设置为YES? – memmons 2010-11-09 02:50:53
这取决于你更新图层的频率。如果您打算将其设置一次,而不是再次更新,则栅格化它会有助于提升性能,前提是您正在为图层制作动画。但是,如果图层的内容经常更新,每次内容更改时都会将该内容呈现为图像,这实际上会损害您的滚动性能(假设您正在滚动/制作动画)。 – 2010-11-09 04:44:29
需要UIBezierPath和bezierPathWithRoundedRect之间的空格。 – 2011-01-29 03:13:36