2011-08-25 57 views
4

我試圖爲我正在構建的應用程序的其中一個創建一個很酷的效果,而不是用drawRect函數來解決這個問題。你們能想到一種簡單的方法來在UIImage周圍放置一個漂亮的圓形邊框嗎?它應該看起來像一個圓形的相框。圍繞UIImage放置圓形框架的最簡單方法

下面是我使用的是什麼至今:

CGFloat radius = self.layer.bounds.size.width/2; 

    CAShapeLayer *mask = [CAShapeLayer layer]; 
    mask.frame = self.layer.bounds; 
    [mask setFillColor:[[UIColor whiteColor] CGColor]]; 

    CGFloat width = self.layer.bounds.size.width; 
    CGFloat height = self.layer.bounds.size.height; 
    CGMutablePathRef path = CGPathCreateMutable(); 
    CGPathMoveToPoint(path, NULL, width, 0); 
    CGPathAddLineToPoint(path, NULL, width, height - radius); 
    CGPathAddCurveToPoint(path, NULL, width, height, width - radius, height, width - radius, height); 
    CGPathAddLineToPoint(path, NULL, 0, height); 
    CGPathAddLineToPoint(path, NULL, 0, radius); 
    CGPathAddCurveToPoint(path, NULL, 0, 0, radius, 0, radius, 0); 
    CGPathCloseSubpath(path); 
    [mask setPath:path]; 
    CGPathRelease(path); 

    self.layer.mask = mask; 

    [self setNeedsDisplay]; 

我的UIImage在一個UIView封裝(自我是一個UIView)。我期待它圍繞我的UIView繪製一個圓圈。

+0

你問如何在不使用視圖的情況下繪製圖像,或者您是否可以繪製圖像而不實際繪製圖像? – Maz

+0

我想圍繞我的圖像畫一個圓圈 – Rob

回答

8

可能做到這一點的最好辦法是使用QuartzCore。

基本上你需要包含QuartzCore框架,然後創建一個UIView來放入你的圖像,然後將其轉到角落並將它的clipsToBounds屬性設置爲YES。

例子:

#include <QuartzCore/QuartzCore.h> 

//More code stuff 

UIView *newView = [[UIView alloc] initWithFrame:frame]; 
newView.clipsToBounds = YES; 
newView.layer.cornerRadius = 10; 
[newView addSubview:imageView]; 
+1

我發現這種方法的唯一問題是,如果你想在你的圖像上有陰影,你會遇到麻煩,因爲你必須clipToBounds 。 – Jarsen

+1

對於遇到麻煩你絕對正確。 這就是爲什麼在我的評論中,我說,「...創建一個UIView將圖像放入......」,在某些情況下這不是一個完美的答案,但它確實可以讓你獲得理想的效果。 – Pudgeball

5

您可以在UIImageView的圖層上使用遮罩,或者將角半徑設置爲高度的一半。在這兩種情況下,一定要#import <QuartzCore/QuartzCore.h>

myImageView.layer.cornerRadius = myImageView.bounds.size.width/2; 

實例面膜做兩個圓角(其他城市,使之成爲圈而不):

+ (void) applyTwoCornerMask: (CALayer *) layer withRadius: (CGFloat) radius { 
    CAShapeLayer *mask = [CAShapeLayer layer]; 
    mask.frame = layer.bounds; 
    [mask setFillColor:[[UIColor blackColor] CGColor]]; 

    CGFloat width = layer.bounds.size.width; 
    CGFloat height = layer.bounds.size.height; 
    CGMutablePathRef path = CGPathCreateMutable(); 
    CGPathMoveToPoint(path, NULL, width, 0); 
    CGPathAddLineToPoint(path, NULL, width, height - radius); 
    CGPathAddCurveToPoint(path, NULL, width, height, width - radius, height, width - radius, height); 
    CGPathAddLineToPoint(path, NULL, 0, height); 
    CGPathAddLineToPoint(path, NULL, 0, radius); 
    CGPathAddCurveToPoint(path, NULL, 0, 0, radius, 0, radius, 0); 
    CGPathCloseSubpath(path); 
    [mask setPath:path]; 
    CGPathRelease(path); 

    layer.mask = mask; 
} 
+0

由於某種原因,這不適合我。這裏的代碼:**代碼將不會適合評論,請檢查編輯** – Rob

1

如何以下方法: 使用第二的UIImageView是在具有要陷害圖像的原始的頂部。這第二個UIImageView具有相框圖像的可拉伸版本,以便在原始圖像更改大小時可以更改相框。

不容易重複使用,但它會很簡單。

您將使用UIImage的stretchableImageWithLeftCapWidth方法來創建圖片幀圖像的拉伸版本。