繁体   English   中英

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

[英]IOS: UIImageView set border white radius and shadow

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

// 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 ,它就像这样工作

在此输入图像描述

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

在此输入图像描述

但是,如果单独使用,设置角落的代码就完美了。 请指导我做什么。 任何帮助将是欣赏

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

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

在此输入图像描述

圆角需要将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;

如果您不希望剪切阴影,则应更新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 ,创建另一个masksToBounds来显示图像,将其masksToBounds设置为YES ,并将其作为子视图添加到avatarImageView这样你就可以了有一个良好的角形和阴影视图,能够显示剪裁的图像。

您需要添加容器视图并在该容器视图中移动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];

您可以根据需要随意调整设置。 请享用!

你应该设置self.avatarImageView.clipsToBounds = YES; set corner

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM