12

以下のコード スニペットで CGContextFillPath が機能しない理由を知っている人はいますか? 次のコードを使用して UIImageView に描画しています。パスを正しくストロークしていますが、CGContextFillPath を無視しています。

UIGraphicsBeginImageContext(self.frame.size);
[drawingView.image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 5.0);
CGContextSetAllowsAntialiasing(UIGraphicsGetCurrentContext(), YES);
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 1.0, 0.0, 0.0, 1.0);
CGContextSetRGBFillColor(UIGraphicsGetCurrentContext(), 1.0, 0.0, 0.0, 1.0);
CGContextBeginPath(UIGraphicsGetCurrentContext());
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), firstMovedTouch.x, firstMovedTouch.y);
CGContextStrokePath(UIGraphicsGetCurrentContext());
CGContextFillPath(UIGraphicsGetCurrentContext());
drawingView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
4

4 に答える 4

27

この問題を解決するには、次のコードを使用します。

CGContextRef context = UIGraphicsGetCurrentContext(); 

CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 1.0);
CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 1.0);
CGContextSetLineJoin(context, kCGLineJoinRound);
CGContextSetLineWidth(context, 8.0);

CGMutablePathRef pathRef = CGPathCreateMutable();

/* do something with pathRef. For example:*/
CGPathMoveToPoint(pathRef, NULL, x, y);
CGPathAddLineToPoint(pathRef, NULL, x, y+100);
CGPathAddLineToPoint(pathRef, NULL, x+100, y+100);
CGPathAddLineToPoint(pathRef, NULL, x+100, y);
CGPathCloseSubpath(pathRef);

CGContextAddPath(context, pathRef);
CGContextFillPath(context);

CGContextAddPath(context, pathRef);
CGContextStrokePath(context);

CGPathRelease(pathRef);
于 2011-07-23T12:40:33.010 に答える
19

パスをストロークして塗りつぶす最良の方法は、パスの設定が完了した後に次のコード行を追加することだと思います。

    CGContextDrawPath(myContext, kCGPathFillStroke);
于 2012-07-28T12:13:39.520 に答える
9

私も同じ悩みを抱えていました。使えないことが分かった

CGContextStrokePath( UIGraphicsGetCurrentContext() ) 
CGContextFillPath( UIGraphicsGetCurrentContext() ) 

パス上でストロークをコミットした後、パスがコンテキストから削除されるため、後者は機能しません。

そのため、同じパスを 2 回使用しました。1 つはストローク用、もう 1 つはフィル用です。

// ... create a path of CGMutablePathRef ....

CGContextSaveGState( context );
//....fill the path .....
CGContextRestoreGState( context );

CGContextSaveGState ( context );
//....stroke the path .....
CGContextRestoreGState( context );

CFRelease( path );
于 2010-12-03T03:36:30.200 に答える
5

CGContextClosePathパスを埋める前に電話する必要があると思います。何を描こうとしているのかCGContextFillPathはわかりませんが、パス内の領域を塗りつぶし、ここには 1 本の線しか表示されません。

于 2010-09-28T01:23:15.673 に答える