这是我设置边框,阴影和角落的代码
// set border
[self.avatarImageView.layer setBorderColor: [[UIColor whiteColor] CGColor]];
[self.avatarImageView.layer setBorderWidth: 2.0];
// set shadow
[self.avatarImageView.layer setShadowOffset:CGSizeZero];
[self.avatarImageView.layer setShadowOpacity:1.0];
self.avatarImageView.clipsToBounds = NO;
// set corner
self.avatarImageView.layer.cornerRadius = 10.0;
self.avatarImageView.layer.masksToBounds = YES;
如果我只使用set border
和set corner
的代码,那么它的效果会很好
但是如果我添加代码set corner
,我会得到这样的结果(边框和角半径工作,但阴影消失了)
然而,如果单独使用,设置角落的代码就完美了。 请指导我做什么。任何帮助将不胜感激
更新
关注@ozgur的回答。在我的代码中添加2行,它将提供非常漂亮的视图,但阴影稍微小一些
self.avatarImageView.layer.shouldRasterize = YES;
self.avatarImageView.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:self.avatarImageView.bounds cornerRadius:10].CGPath;
答案 0 :(得分:4)
圆角需要将maskToBounds设置为YES。因为它可以显示任何超过边界(如阴影),因为它将被屏蔽/剪掉。如果禁用maskToBounds以使其显示,那么圆角将无法工作,因为它们无法将图像蒙版/剪裁成圆角形状,因为您禁用了masksToBounds。
因此,您无法在一个视图上同时执行这两项操作,因此您需要两个视图。
你需要使UIView与UIImageView具有相同的尺寸,并使UIImageView成为你的UIView的子视图。
然后在你的UIImageView上将masksToBounds设置为YES,并将其设置为' superview(具有相同尺寸的UIView)将masksToBounds设置为NO并相应地添加属性。
将您的代码更改为:(使用xCode键入所有内容,以便我可以使用拼写错误)
UIView *avatarImageViewHolder = [[UIView alloc] initWithFrame:self.avatarImageView.frame];
avatarImageViewHolder.backgroundColor = [UIColor clearColor];
[avatarImageView.superview addSubview:avatarImageViewHolder];
avatarImageViewHolder.center = avatarImageView.center;
[avatarImageViewHolder addSubview:avatarImageView];
avatarImageView.center = CGPointMake(avatarImageViewHolder.frame.size.width/2.0f, avatarImageViewHolder.frame.size.height/2.0f);
self.avatarImageView.layer.masksToBounds = YES;
avatarImageViewHolder.layer.masksToBounds = NO;
// set avatar image corner
self.avatarImageView.layer.cornerRadius = 10.0;
// set avatar image border
[self.avatarImageView.layer setBorderColor: [[UIColor whiteColor] CGColor]];
[self.avatarImageView.layer setBorderWidth: 2.0];
// set holder shadow
[avatarImageViewHolder.layer setShadowOffset:CGSizeZero];
[avatarImageViewHolder.layer setShadowOpacity:1.0];
avatarImageViewHolder.clipsToBounds = NO;
答案 1 :(得分:1)
如果您不想修剪阴影,则应更新layer.shadowPath
:
self.avatarImageView.layer.shouldRasterize = YES;
self.avatarImageView.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:self.avatarImageView.bounds cornerRadius:10].CGPath;
要使这个技巧奏效,clipsToBounds
和他的兄弟masksToBounds
应设置为NO
。
因此,如果您的图像的大小大于avatarView自己的边界,则应将avatarImageView定义为普通UIView
,创建另一个imageView以显示图像集masksToBounds
到YES
并将其作为子视图添加到avatarImageView
,以便您拥有能够显示剪切图像的良好的角形和阴影视图。
答案 2 :(得分:1)
您需要添加容器视图并在该容器视图中移动您的imageview,执行此操作后使用此代码:
CALayer *imageViewLayer= self.imageView.layer;
imageViewLayer.cornerRadius= 20.0f;
imageViewLayer.masksToBounds= YES;
CALayer *containerLayer = self.containerView.layer;
containerLayer.borderColor= [UIColor whiteColor].CGColor;
containerLayer.borderWidth= 3.0f;
containerLayer.cornerRadius= 20.0f;
containerLayer.shadowOffset = CGSizeMake(0, 0);
containerLayer.shadowColor = [UIColor blackColor].CGColor;
containerLayer.shadowRadius = 10.0f;
containerLayer.shadowOpacity = 0.80f;
containerLayer.masksToBounds= NO;
containerLayer.shadowPath = [[UIBezierPath bezierPathWithRect:containerLayer.bounds] CGPath];
您可以根据需要随意调整设置。享受!
答案 3 :(得分:0)
您应该在self.avatarImageView.clipsToBounds = YES;
set corner