为什么 maskToBounds = YES 会阻止 CALayer 阴影?
通过以下代码片段,我向我的 UIView 添加了阴影效果。效果非常好。但是一旦我将视图的 masksToBounds 属性设置为YES。不再渲染阴影效果。
self.myView.layer.shadowColor = [[UIColor blackColor] CGColor];
self.myView.layer.shadowOpacity = 1.0;
self.myView.layer.shadowRadius = 10.0;
self.myView.layer.shadowOffset = CGSizeMake(0.0f, 0.0f);
self.myView.layer.cornerRadius = 5.0;
self.myView.layer.masksToBounds = YES; // <-- This is causing the Drop shadow to not be rendered
UIBezierPath *path = [UIBezierPath bezierPathWithCurvedShadowForRect:self.myView.bounds];
self.myView.layer.shadowPath = path.CGPath;
self.myView.layer.shouldRasterize = YES;
您对此有什么想法吗?
With the following snippet, I'm adding a drop shadow effect to one my UIView. Which works pretty well. But as soon as I set the view's masksToBounds property to YES. The drop shadow effect isn't rendered any more.
self.myView.layer.shadowColor = [[UIColor blackColor] CGColor];
self.myView.layer.shadowOpacity = 1.0;
self.myView.layer.shadowRadius = 10.0;
self.myView.layer.shadowOffset = CGSizeMake(0.0f, 0.0f);
self.myView.layer.cornerRadius = 5.0;
self.myView.layer.masksToBounds = YES; // <-- This is causing the Drop shadow to not be rendered
UIBezierPath *path = [UIBezierPath bezierPathWithCurvedShadowForRect:self.myView.bounds];
self.myView.layer.shadowPath = path.CGPath;
self.myView.layer.shouldRasterize = YES;
Do you have any ideas on this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
因为阴影是在 View 外部完成的效果,并且 maskToBounds 设置为 YES 将告诉 UIView 不要绘制其自身之外的任何内容。
如果您想要带有阴影的圆角视图,我建议您使用 2 个视图:
Because shadow is an effect done outside the View, and that masksToBounds set to YES will tell the UIView not to draw anything that is outside itself.
If you want a roundedCorner view with shadow I suggest you do it with 2 views:
现在是 iOS 6,事情可能已经改变了。 TheSquad 的答案对我不起作用,直到我设法再添加一行
view2.layer.masksToBounds = NO;
,否则阴影不会显示。尽管文档说默认情况下masksToBounds
为“否”,但我的代码显示了相反的情况。以下是我制作带有阴影的圆角按钮的方法,这是我的应用程序中最常用的代码片段之一。
编辑
如果视图需要动画或滚动,
masksToBounds = YES
会显着影响性能,这意味着动画可能会卡顿。要获得圆角和阴影以及平滑的动画或滚动,请改用以下代码:It's iOS 6 now, things might have changed. TheSquad's answer don't work for me until I managed to add one more line
view2.layer.masksToBounds = NO;
, otherwise shadow doesn't show. Although documentation saysmasksToBounds
is NO by default, my code shows the opposite.Here is how I make a rounded corner button with shadow, which is among the most commonly used code snippet in my app.
EDIT
If views need to be animated or scrolled,
masksToBounds = YES
tax performance significantly, which means animation will probably get stuttered. To get rounded corner and shadow AND smooth animation or scrolling, use following code instead:带有 StoryBoard 的 Swift 3.0 版本
与 @TheSquad 的想法相同。在实际视图下创建一个新视图,并为下面的视图添加阴影。
1.在实际视图下创建一个视图
将
UIView
拖动到 StoryBoard,与目标视图具有相同的约束。检查要绑定到目标视图的剪辑。还要确保新视图列在目标视图之前,以便目标视图覆盖新视图。2.现在将新视图链接到您的代码,在其上添加阴影
这只是一个示例。在这里你可以做任何你想做的事
Swift 3.0 version with StoryBoard
The same idea with @TheSquad. Create a new view under the actual view and add shadow to the lower view.
1. Create a view under the actual view
Drag a
UIView
to StoryBoard with same constraint as your target view. Check clip to bound for the target view. Also make sure the new view is listed before the target view so that the target view will cover the new view.2. Now link the new view to your code add add shadow on it
This is just a sample. You can do whatever way you want here
这是 @TheSquad 发布的答案的 Swift 3 和 IBDesignable 版本。
我在更改故事板文件时使用了相同的概念。首先,我将我的 targetView (需要圆角半径和阴影的)移动到一个新的 containerView 中。然后我添加了以下代码行(参考:https://stackoverflow.com/a/35372901/419192)为 UIView 类添加一些 IBDesignable 属性:
添加此代码后,我回到故事板并选择我的 containerView 我现在可以在属性检查器中找到一组新属性:
< /a>
除了根据我的选择为这些属性添加值之外,我还在 targetView 中添加了一个圆角半径,并将 maskToBounds 属性设置为 true。
我希望这有帮助:)
This is the Swift 3 and IBDesignable version of the answer posted by @TheSquad.
I used the same concept while making changes in the storyboard file. First I moved my targetView (the one which requires corner radius and shadow) inside a new containerView. Then I added the following lines of code (Reference: https://stackoverflow.com/a/35372901/419192) to add some IBDesignable attributes for UIView Class:
After adding this code, I went back to the storyboard and on selecting my containerView I could now find a new set of attributes in the attributes inspector:
Other than adding values for these attributes as per my choice, I also added a corner radius to my targetView and set the masksToBounds property as true.
I hope this helps :)
我还遇到了阴影和圆角的严重性能问题。我没有使用 ShadowPath 部分,而是使用了以下几行,完美地解决了性能问题:
I also had drastic performance issues with shadows and rounded corners. Instead of using the shadowPath part, I used the following lines which perfectly solved the performance hit:
这是解决方案之一:
Here is one of the solutions: