2016-03-24 158 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]; 

隨意調整設置根據你的需要。請享用!

相關問題