IOS:UIImageView设置边框白色半径和阴影

时间:2016-03-24 03:16:41

标签: ios objective-c uiimageview

这是我设置边框,阴影和角落的代码

// 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 borderset corner的代码,那么它的效果会很好

enter image description here

但是如果我添加代码set corner,我会得到这样的结果(边框和角半径工作,但阴影消失了)

enter image description here

然而,如果单独使用,设置角落的代码就完美了。 请指导我做什么。任何帮助将不胜感激

更新
关注@ozgur的回答。在我的代码中添加2行,它将提供非常漂亮的视图,但阴影稍微小一些

self.avatarImageView.layer.shouldRasterize = YES;
self.avatarImageView.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:self.avatarImageView.bounds cornerRadius:10].CGPath;

enter image description here

4 个答案:

答案 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以显示图像集masksToBoundsYES并将其作为子视图添加到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