2012-03-03 4 views
0

概要パースペクティブでトレイルのように見えるCGPathを作成します。 UIViewサブクラスに次のコードがあります。私はNSLogsを通してメソッドに入っていることを知っています。 CGPathは画面に表示されません。CGPathが表示されない

- (void)drawRect:(CGRect)rect{ 
    CGMutablePathRef p = CGPathCreateMutable(); 
    CGPathMoveToPoint(p, NULL , 150 , 150); 
    CGPathMoveToPoint(p, NULL , 300 , 300); 
    CGPathMoveToPoint(p, NULL , 100 , 150) ; 
    CGPathMoveToPoint(p, NULL , 150 , 150); 
    CGPathAddLineToPoint(p, NULL , 300 , 300); 
    CGPathAddLineToPoint(p, NULL , 100 , 150) ; 
    CGPathAddLineToPoint(p, NULL , 150 , 150); 

    CGPathCloseSubpath(p) ; 

    CGContextRef context=UIGraphicsGetCurrentContext(); 
    CGContextBeginPath(context); 
    CGContextAddPath (context, p) ; 
    CGContextSaveGState(context); 

    CGColorRef redColor = [UIColor colorWithRed:1.0 green:12.0 blue:0.0 alpha:0.0].CGColor; 
    CGContextSetFillColorWithColor(context, redColor); 
    CGContextSetLineWidth(context, 20.0); 
    CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor); 

    CGContextStrokePath(context); 
    CGContextFillPath (context) ; 

    CGContextDrawPath(context, kCGPathFill); 
    CGContextRestoreGState(context); 
} 

何も現れません

答えて

1

フレームワークが-drawRect:ですでにあなたのために設定し、表示装置に向け、適切なグラフィックスコンテキストがあることを確認し、事前のおかげで 。他の場所、たとえば画像にレンダリングするように設定する場合は、UIGraphicsBeginImageContext()/UIGraphicsEndImageContext()が必要です。

これらの呼び出しを削除すると、動作がより良くなります。今は、ビュー自体ではなく、画面外のバッファーにレンダリングしています。

編集:ただし、コードの周りにCGContextSaveGState()/CGContextRestoreGState()の呼び出しを追加する必要があります。これにより、-drawRect:が特定の方法で使用されている場合、他のグラフィックスコードのグラフィックスコンテキストが汚染されないようになります。

編集2:申し訳ありませんが、最後の返信の後に問題を解決したことがわかりますが、アーカイブのために、-drawRect:に直接電話することはありません(ただし、ここで適用する)。あなたが直接呼び出したので、グラフィックスのコンテキストが設定されていないため、クラッシュしました。再描画をトリガする適切な方法は、ビュー-setNeedsDisplayを送信することです。これにより、フレームワークはグラフィックスコンテキストを設定し、実行ループの適切な時点で-drawRect:を呼び出します。

+0

私のコードの購入を更新しましたが、何も表示されません。何かを意味する場合、私はViewControllerを持っています。そして私はエラーが発生する:CGContextBeginPath:無効なコンテキスト0x0 – Asdrubal

+0

何?私は文脈がどのようにゼロかもしれないか見ていない。あなたは電話をしていますか?drawRect:万が一あなた自身? –

+0

はい私はそれを – Asdrubal

1

iOSの場合は、UIBezierPathを使用してベジェパスに切り替えます。確実に働くこと。 はまた、私は、彼らがそうのように、右にそれらの後に1 addLineToPointを持っている必要がある場合、あなたのmoveToPointsのそれぞれは、単一の行にある、気づいた:

CGPathMoveToPoint(P、NULL、150、150); CGPathAddLineToPoint(p、NULL、300、300);

CGPathMoveToPoint(P、NULL、300、300; CGPathAddLineToPoint(P、NULL、100、150);

CGPathMoveToPoint(P、NULL、100、150); CGPathAddLineToPoint(P、NULL、100、 150);

CGPathMoveToPoint(P、NULL、150、150); CGPathAddLineToPoint(P、NULL、150、150);

しかし、あなたはどのように見たら、とにかくUIBezierPathsに切り替えたいですよ彼らは簡単です。

+0

を参照してください。私はUIBezierPathが使用可能な場合にはすぐれたショートカットであると争うことはありませんが(また、クロスプラットフォームの描画コードを書くこと)、UIBezierPathは、私が自分の応答で概説した大きな理由から、スティーブンにとっても同様に失敗しました。しかし、それは壊れているが、欠落していない図面につながる。 –

+0

ああ、私はあなたがそこに何を意味するかを見ます。それを指摘してくれてありがとう!私は毎日何か新しいことを学びます:D –

関連する問題