2012-01-01 19 views
2

私はカスタムコントロールを作っています。コントロールのサブビューの1つは、透明なUIViewで、UIBezierPathパスが描画されます。写真の1つには、UIBezierPathの境界線(「パスストローク」と呼ばれています)がありますが、2番目のものでは[パスフィル]と呼ぶとどうなるかを見ることができます。私は最初の写真のものと似た形を作るために道をいっぱいにしたい。この透明なdrawRectメソッドUIViewは以下の通りです。不規則な形のUIBezierPathの塗りつぶし

- (void)drawRect:(CGRect)rect 
{ 
// Drawing code 
[super drawRect:rect]; 
UIBezierPath *path; 
[[UIColor greenColor] setStroke]; 
[[UIColor greenColor] setFill]; 
//Angles 

CGFloat startAngle = degreesToRadians(225); 
CGFloat endAngle = degreesToRadians(315); 

CGPoint center = CGPointMake(CGRectGetMidX(rect), lRadius); 
path = [UIBezierPath bezierPathWithArcCenter: center radius:lRadius startAngle:startAngle endAngle:endAngle clockwise:YES]; 
rightEndOfLine = path.currentPoint; 
bigArcHeight = rightEndOfLine.y; 


CGFloat smallArcHeight = lRadius - bigArcHeight - sRadius; 
CGFloat smallArcWidthSquare = (8*smallArcHeight*sRadius) - (4 * (smallArcHeight * smallArcHeight)); 
smallArcWidth = sqrtf(smallArcWidthSquare); 


leftStartOfLine = CGPointMake((rect.size.width - smallArcWidth)/2, lRadius-sRadius + smallArcHeight);  
CGFloat lengthOfSpace = (rect.size.width - rightEndOfLine.x); 

[path moveToPoint:leftStartOfLine]; 
[path addArcWithCenter:center radius:sRadius startAngle:startAngle endAngle:endAngle clockwise:YES]; 
rightStartOfLine = path.currentPoint; 
leftEndOfLine = CGPointMake(lengthOfSpace, bigArcHeight); 
[path moveToPoint:rightStartOfLine]; 
[path addLineToPoint:rightEndOfLine]; 
[path moveToPoint:leftStartOfLine]; 
[path addLineToPoint:leftEndOfLine]; 
[path closePath]; 
[path stroke]; 
// [path fill]; 

} 

ありがとうございました!

First Image Second Image

答えて

5

あなたmoveToPoint呼び出しのすべてを削除するようにしてください。これは連続的な形状であるため、必須ではなく、塗りつぶしアルゴリズムが混乱します。左上隅から開始し、円弧を時計回りに描画し、セグメント(?)線を描画し、円弧を反時計回りに描画してから、最後の線分を描画する(またはパスを閉じる)ことができます。これは正しく記入されます。

関連する問題