5

いくつかのパスセグメント、実線、破線、線、色、円弧などで構成される複雑な UIBezierPath を作成しました。これを持っているので、CGContext にレンダリングしたいと思います。

だから、私はそれをCGPathReferenceに変換します

CGPathRef cgPath = CGPathCreateCopy(aBezierPath.CGPath);

問題はこれです: 理論的には、CGContext にパスを描画したい場合、異なる必要があるセグメントごとにストロークの幅、色、線のスタイル、ブレンド モードなどを定義する必要がありますが、UIBezierPath はhave already created には、このすべての情報が含まれています。

それで、CGContextにあるようにCGPathを「スタンプ」するだけの方法があるのではないかと思うので、元の情報がすべてスタンプされますか?

ありがとう。

4

1 に答える 1

6

DR さん、その通りです。非常に紛らわしいです。

しかし、Tom は正しいと思います。[aBezierPath ストローク] を使用してください。

したがって、次のようになります。

REFは、作成した (CGContextRef) です。

YOURBEZIERPATHは (UIBezierPath*) です。

必然的に、「逆さまの描画」の問題に対処する必要があるため、次のようになります。

UIGraphicsPushContext(REF);
CGContextSaveGState(REF);
CGContextTranslateCTM(REF, 0, the height*);
CGContextScaleCTM(REF, 1.0, -1.0);
[YOURBEZIERPATH stroke];
CGContextRestoreGState(REF);
UIGraphicsPopContext();

それだけです。

以下のコメントを再確認してください: UIBezierPaths の配列があります。各ベジエには独自のスタイルと色があります。

これは役に立ちますか?... 1 つの「ストローク」呼び出しを for ループに置き換えます。

UIGraphicsPushContext(REF);
CGContextSaveGState(REF);
CGContextTranslateCTM(REF, 0, the height*);
CGContextScaleCTM(REF, 1.0, -1.0);

for each of YOURBEZIERPATH in your array...
    {
    CGContextSaveGState(REF);
    [YOURBEZIERPATH stroke];
    CGContextRestoreGState(REF);
    }

CGContextRestoreGState(REF);
UIGraphicsPopContext();

実際には、わざわざ aBezierPath.CGPath またはそのコピーを使用する必要はありません。

繰り返しますが、UI と CG の 2 つの世界は非常に紛らわしいです !!


*高さ: 多くの場合、self.frame.size.height のようなものです。将来、一般的なコード例を探している人のために、これを含めます。

于 2011-06-11T13:50:54.407 に答える