9

ストロークのストロークを持つCGPathを描画しようとしています。

基本的にはCGPathを使って線を引きたいです。次に、戻って最後のCGPathの両側に線を引き、輪郭であるという効果を与えたいと思います。

この線はどのように曲がったり曲がったりする可能性がありますが、私は常に外側の2本の線をたどる必要があります。

道

編集:線の中央を透明にする必要がありますが、輪郭は黒一色になります。

4

2 に答える 2

15

CGPathCreateCopyByStrokingPath古いパスを一定の幅でストロークして、新しいパスを作成するために使用します。次に、を使用して新しいパスを描画しますkCGPathFillStroke

- (void)drawRect:(CGRect)rect {
  CGContextRef context = UIGraphicsGetCurrentContext();

  CGMutablePathRef path = CGPathCreateMutable();
  CGPathMoveToPoint(path, NULL, 50, 50);
  CGPathAddLineToPoint(path, NULL, 200, 200);

  CGPathRef thickPath = CGPathCreateCopyByStrokingPath(path, NULL, 10, kCGLineCapButt, kCGLineJoinBevel, 0);
  CGContextAddPath(context, thickPath);

  CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);
  CGContextSetFillColorWithColor(context, [UIColor blueColor].CGColor);
  CGContextSetLineWidth(context, 3);
  CGContextDrawPath(context, kCGPathFillStroke);

  CGPathRelease(thickPath);
  CGPathRelease(path);
}
于 2013-01-16T21:37:58.753 に答える
5

最も簡単な解決策は、パスを2回ストロークすることです。最初にストローク幅を大きくした黒で、次にストローク幅を少し小さくした青色を使用して同じパスを再度ストロークします。

編集:
私が正しく覚えていればCGPathCreateCopyByStrokingPath(...)、ストロークと塗りつぶしの両方ができる新しいパスを作成するために使用できます。次に、半透明の色を使用できます。

ドキュメントから:

CGPathCreateCopyByStrokingPath

別のパスのストロークコピーを作成します。

CGPathRef CGPathCreateCopyByStrokingPath(
                                         CGPathRef path,
                                         const CGAffineTransform *transform,
                                         CGFloat lineWidth,
                                         CGLineCap lineCap,
                                         CGLineJoin lineJoin,
                                         CGFloat miterLimit 
                                         ); 

パラメータ
path
コピーするパス。

transform
アフィン変換行列へのポインター。変換が不要な場合はNULL。指定した場合、Quartzは、変換されたパスの要素を新しいパスに追加する前に、それらの要素に変換を適用します。

lineWidth
使用する線幅(ユーザースペース単位)。値は0より大きくなければなりません。

lineCap
ラインキャップスタイル定数-kCGLineCapButt(デフォルト)、kCGLineCapRound、またはkCGLineCapSquare。「CGLineCap」を参照してください。

lineJoin
ライン結合値-kCGLineJoinMiter(デフォルト)、kCGLineJoinRound、またはkCGLineJoinBevel。「CGLineJoin」を参照してください。

miterLimit
使用するマイター制限。

于 2013-01-16T21:24:11.917 に答える