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 添加阴影的主要内容,如果未能解决你的问题,请参考以下文章

仅将角半径设置为 UIView/UIButton 的特定侧

未显示超级视图子视图 UIView 的角半径

UIVIew 角半径和阴影?

具有拐角半径和阴影视图的 UIView 不会在拐角处剪辑子视图

如何在没有问题的情况下将角半径应用于 UIView?

如何使用 Xcode 8 将 UIView 作为具有圆角半径的圆