2016-03-24 77 views
2

这里是我的设置边框,阴影和角码IOS: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

+0

是什么'self.view'? – ozgur

+0

我复制了你的代码并运行它。图像看起来像剪辑给我的。你确定你没有更新其他地方的'masksToBounds'或'clipsToBounds'吗? – ozgur

+0

@ozgur我确定不会在另一个地方更新'masksToBounds'或者'clipsToBounds' –

回答

2

圆角要求将masksToBounds设置为YES。因为没有超越边界(如影子)可以显示,因为它会被屏蔽/截断。如果禁用了masksToBounds,那么它将显示圆角不会工作,因为它们无法将图像蒙版/剪裁成圆形,因为您禁用了masksToBounds。

因此,您无法在一个视图上同时执行这两个操作,因此您需要两个视图。

您需要制作与UIImageView相同尺寸的UIView,并使UIImageView成为UIView的子视图。

然后在您的UIImageView上将masksToBounds设置为YES,并在其'superview(具有相同尺寸的UIView)上将masksToBounds设置为NO并相应地添加属性。


更改您的代码如下:(键入它所有的W/O使用的XCode因此它可能我有错别字)

UIView *avatarImageViewHolder = [[UIView alloc] initWithFrame:self.avatarImageView.frame]; 
avatarImageViewHolder.backgroundColor = [UIColor clearColor]; 
[avatarImageView.superview addSubview:avatarImageViewHolder]; 
//[avatarImageView removeFromSuperview];//only use this if your object retains its' properties after being removedFromSuperview. (ARC? idk) 
[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; 
+0

谢谢你的回答,但是当我使用你的代码时,我会得到像我的文章中的图片一样的结果(角落半径不起作用) –

+0

@PhanVănLinh对不起,我的代码中有一个小小的错字,我现在修好了尝试。 –

+0

@PhanVănLinh你有机会尝试我的修改过的代码吗? –

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如此您将拥有一个良好的角度和阴影视图,可以显示剪切后的图像。

+0

谢谢你的回答。我将结果图像发布到我的问题。我会用你的解决方案来处理我的项目,因为它很漂亮,但我会保留这个问题来找到让阴影变大一点的方法 –

+0

另外,你提到我将'clipsToBounds'和'masksToBounds'设置为NO,但是如果我设置了'masksToBounds = NO'。半径不起作用 –

+0

@PhanVănLinh如果要使阴影看起来更大,则应更新阴影偏移。 – ozgur

0

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

+0

我在集合'shadow'中设置了'self.avatarImageView.clipsToBounds = NO;'。现在我应该将其更改为YES,或者我需要将一个新的代码行添加到'set corner'。此外,我试图超过上述方式,但仍然无法正常工作。结果图像与我的帖子中的第二张图像相同。 –

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]; 

随意调整设置根据你的需要。请享用!

相关问题