2013-03-16 82 views
1

我正在嘗試繪製一個半透明的黑色矩形,中間切出一個三角形。QuartzCore - 在多邊形中添加圓角

我可以用下面的代碼完美地工作。但是,我想繞過三角形的角落。

我已經嘗試了幾種不同的技術來添加圓角,例如爲筆畫設置CGContextSetLineCap,並通過創建我的石英路徑和使用CGContextAddArcToPoint,但我沒有得到任何工作。

正如我所提到的,下面的代碼適用於三角形切口。我如何繞過三角形的角落?

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGPoint position = CGPointMake(rect.size.width/2, rect.size.height * .7); 
CGSize size = CGSizeMake(rect.size.width*.8, rect.size.height*.5); 

CGFloat firstPointX = (position.x - (size.width/2)); 
CGFloat firstPointY = (position.y - (size.height)); 
CGPoint firstPoint = CGPointMake(firstPointX, firstPointY); 

CGFloat secondPointX = position.x + (size.width/2); 
CGFloat secondPointY = position.y - (size.height); 
CGPoint secondPoint = CGPointMake(secondPointX, secondPointY); 


UIBezierPath *path = [UIBezierPath bezierPath]; 
[path moveToPoint:position]; 
[path addLineToPoint:firstPoint]; 
[path moveToPoint:firstPoint]; 
[path addLineToPoint:secondPoint]; 
[path addLineToPoint:position]; 
[path closePath]; 

CGContextAddRect(context, rect); 
CGContextAddPath(context, path.CGPath); 
CGContextEOClip(context); 

UIColor *translucentColor = [UIColor colorWithWhite:0 alpha:0.5]; 
CGContextSetFillColorWithColor(context, translucentColor.CGColor); 

CGContextFillRect(context, rect); 

UIGraphicsEndImageContext(); 

編輯:這是我想要完成的一個例子。

enter image description here

+0

確定 - 我已經刪除了我以前的答案,因爲我已經嘗試過了,而且似乎無法使其與裁剪一起工作。如果您敲擊路線,圓線加入正常工作。現在是凌晨4點。明天我會再次嘗試。 – 2013-03-16 04:10:43

+0

你有沒有試過CGContextAddArc? – badweasel 2013-03-16 05:59:34

回答

3

我想你想使用CGContextAddArc。如有必要,它會繪製一個帶有一條直線的圓的一部分。這裏是繪製一個填充UIView的圓角框的代碼。對於一個三角形,你會有3條線而不是4條。頂部有兩條,底部有一條。這是從roundBoxView I類有:

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGRect boxRect = self.bounds; 

float bRadius = self.cornerRadius; 
float shrink = self.strokeThickness/2; 

CGContextBeginPath(context); 

// instead of this gray you could later add options for other colors 
CGContextSetGrayFillColor(context, 0.0f, self.backgroundOpacity); 
CGContextMoveToPoint(context, CGRectGetMinX(boxRect)+shrink + bRadius, CGRectGetMinY(boxRect)+shrink); 

CGContextAddArc(context, CGRectGetMaxX(boxRect)-shrink - bRadius, CGRectGetMinY(boxRect)+shrink + bRadius, bRadius, 3 * (float)M_PI/2, 0, 0); 
CGContextAddArc(context, CGRectGetMaxX(boxRect)-shrink - bRadius, CGRectGetMaxY(boxRect)-shrink - bRadius, bRadius, 0, (float)M_PI/2, 0); 
CGContextAddArc(context, CGRectGetMinX(boxRect)+shrink + bRadius, CGRectGetMaxY(boxRect)-shrink - bRadius, bRadius, (float)M_PI/2, (float)M_PI, 0); 
CGContextAddArc(context, CGRectGetMinX(boxRect)+shrink + bRadius, CGRectGetMinY(boxRect)+shrink + bRadius, bRadius, (float)M_PI, 3 * (float)M_PI/2, 0); 

CGContextClosePath(context); 
CGContextFillPath(context); 

當然不是boxRect是完整的邊界,你可以傳遞給你的方法和使用任何你想要的邊界畫吧。爲了使它成爲三角形,你只需要三條線而不是兩條線,你可能需要做一些數學計算開始和結束角度。在一個盒子上,這些角度總是90度(這裏給出的是icky弧度),但是在一個三角形上,您要麼需要動態地計算角度,要麼在三角形上預設縱橫比,這樣您就可以使用預設的起始角度和終止角度。在這個例子中,如果用3個相等的角度拍攝,你會做120度或M_PI/1.5尺寸的步驟。