iOS6 向具有角半径的容器 UIView 添加阴影
Posted
技术标签:
【中文标题】iOS6 向具有角半径的容器 UIView 添加阴影【英文标题】:iOS6 Add Shadow to A Container UIView With A Corner Radius 【发布时间】:2013-05-28 20:15:52 【问题描述】:一个环绕的 UIView 怎么可能同时有阴影和圆角半径?
我多次尝试过 SO 上建议的其他解决方案,但不幸的是,它们似乎不适用于 ios6(或者至少不适用于我)
所以我想我可能会发布这个,以便可以找到 iOS6 解决方案。
我有一个容器UIView
,其中包含两个子视图
- a custom UIImageView
- a custom UIView
我希望整个 UIView 的角半径为 2.5,但我也希望 UIView 有阴影。 但是,到目前为止,我只得到了这 2 个愿望中的 1 个,从来没有同时得到这两个。
这是我的代码,我有不同的版本,我对 SO 解决方案的不同尝试,但这只是我的版本之一。
self.layer.shouldRasterize = YES;
self.layer.rasterizationScale = [UIScreen mainScreen].scale;
self.layer.cornerRadius = 2.5;
self.layer.masksToBounds = YES;
self.layer.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.1].CGColor; //0.1
self.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.bounds].CGPath;
self.layer.shadowOpacity = 1.0;
self.layer.shadowRadius = 3.0;
^here self 是包含上述两个子视图的自定义 UIView
有谁知道解决这个问题的 iOS6 解决方案?
更新
所以,我不需要边框颜色,所以当我看到解决方案时我没有添加,但这次我添加了,使用下面评论中的解决方案,似乎 UIView 正在变得四舍五入,但我真的希望 UIImageView 和 UIView 的组合得到四舍五入。
所以基本上,UIImageView 在顶部,UIView 在底部。
那么我如何只让 UIImageView 的顶部被舍入,而只有 UIView 的底部被舍入。
谢谢。
注意:阴影作为一个整体对象起作用,但圆角半径不是作为一个整体对象起作用?
【问题讨论】:
你看过这个答案吗? ***.com/questions/4754392/… 是的,该页面上的所有解决方案都不适合我,不幸的是@jfuellert @jfuellert 看到更新,有什么想法吗? 正如@Marcin Kuptel 在他的回答中所说,禁用 maskToBounds 会让您看到阴影,因为它不会被视图的边界修剪(阴影宽度不会添加到视图的尺寸中)。不过我建议尝试他的解决方案。 @jfuellert 我试过了,但圆角不适用于他的解决方案(至少对于我的 UIView),感谢您的帮助 【参考方案1】:我想通了。
self.layer.shouldRasterize = YES;
self.layer.rasterizationScale = [UIScreen mainScreen].scale;
self.layer.shadowColor = [UIColor colorWithWhite:0.0 alpha:0.8].CGColor;
self.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:self.layer.bounds cornerRadius:self.layer.cornerRadius].CGPath;
self.layer.shadowOpacity = 1.0;
self.layer.shadowRadius = 3.0;
UIView *container = [[UIView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
[self addSubview:container];
[container addSubview:self.someCustomUIView];
[container addSubview:self.someCustomImageView];
container.layer.cornerRadius = 2.5;
container.layer.masksToBounds = YES;
所以基本上:
-
我设置了主 UIView 的阴影。
我创建了一个包含其他两个子视图的容器子视图
我设置了容器子视图的圆角半径
瞧!有效!
我希望这适用于在一个 UIView 中有多个子视图的其他人
感谢大家的帮助。 :)
【讨论】:
【参考方案2】:我认为你应该更改这行代码:
self.layer.masksToBounds = YES;
到这个
self.layer.masksToBounds = NO;
如果您将 maskToBounds 设置为 YES,那么您将不会看到超出视图边界的任何内容,而阴影就是这种情况。
此代码来自我当前的项目(iOS 6),它运行良好。我可以看到圆角和阴影。
self.layer.masksToBounds = NO;
self.layer.cornerRadius = 5.0;
self.layer.shadowColor = [UIColor blackColor].CGColor;
self.layer.shadowOffset = CGSizeMake(0, -1);
self.layer.shadowOpacity = 0.6;
UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRect: self.layer.bounds];
self.layer.shadowPath = shadowPath.CGPath;
【讨论】:
这种方法没有圆角(或者至少由于某种原因我的 UIView 没有)@MarcinKuptel 即使你设置了 shadowRadius ? 是的,我很感激你的帮助,我会继续努力,我不确定我的 UIView 出了什么问题,但它似乎不起作用。我觉得问题在于包含两个子视图而不是主 UIView 查看我的答案,看看什么对我有用。我也赞成你的,因为我相信它对查看这篇文章的其他人有用。 :) @MarcinKuptel 我得到了阴影,但它出现在目标 UIView 上方?以上是关于iOS6 向具有角半径的容器 UIView 添加阴影的主要内容,如果未能解决你的问题,请参考以下文章