[英]IOS: UIImageView border white with radius display a strange dark line in 4 corners
[英]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 border
和set 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.