2009-05-25 6 views
2

私はXcodeの初心者ですから、Quartz2Dの学習曲線に登場しています。私はビューのdrawRectメソッドがビューのグラフィックスのリフレッシュが必要なときに呼び出され、setNeedsDisplayメソッドが再描画をアクティブにすることを理解しています。ビューをグラフィックコンテキストに接続する方法は?

しかし、私が見つけることができないのは、グラフィックスコンテキストと特定のビューの関係についての明確な説明です。グラフィックスコンテキスト自体は明らかにビューのインスタンス変数ではないので、ビューを変更したい場合はCGContext ...メソッドを使用して複雑なパスを作成し、そのグラフィックスコンテキストをビューIと結びつけるのにどのコードが必要です変更したい?

この質問に関する事前のご案内ありがとうございます。

jrdoner

+0

XcodeのはIDEであり、それはあなたが使用するフレームワークとは何の関係もありませんあなたが登ることができます。 –

+0

この質問がCocoa(Mac)やCocoa Touch(iPhone)をターゲットにしているかどうかを明確にすることができれば、おそらく助けになるでしょう。 ) –

答えて

3

あなたはグラフィックスコンテキストを作成することができますが、それだけで、それはあなたのために行われている例で最もoperation.For複雑な描画に必要とされています。 UIGraphicsGetCurrentContext()を呼び出すだけでコンテキストを取得する必要があります。

ビューが再描画する必要があると判断した場合(さまざまな理由で、setNeedsDisplay:を呼び出して表示したものの1つ)、そのビューのグラフィックスコンテキストを生成(または復元)し、現在のものにしますコンテキスト-drawRect:を呼び出す前に。あなたの仕事は、あなたが提供された文脈の中で描くことです。その後、結果のコンテキストをクリップし、他のコンテキストとブレンドし、最終的に画面メモリに描画するのは、フレームワークの問題です。

あなたが手助けできる場合は、-drawRect:であまりにも多くの複雑な描画をするのに少し注意してください。 iPhoneはデスクトップマシンほど強力なCPUを持っていないので、パスではなく画像を使って描画作業の大部分を行うことをお勧めします。 Appleは、Macからより便利な描画ラッパーの多くを削除した。これは、意図的に開発者がCore Graphicsをあまり使わないようにすることを嫌っている。

+0

偉大な答え.Btw、あなたが何を言っているかdrawRectの複雑な描画は非常に興味深いです。詳細はこちらをご覧ください。プログラムによる描画よりも画像の読み込みを優先させることに関するAppleの正式な文書(またはその他の議論)について知っていますか? – erikprice

+0

フォローアップするには、プログラムで描画されたコンテンツをCGLayerに書き込むことになります(drawRect:で繰り返し再描画するのではなく)。 – erikprice

+0

アップルの推奨事項に関しては、私がWWDCのノートから出したものです。なぜ彼らはエンドキャップとボタンのグラデーションを使って画像を伸ばしたいのかを議論しました。そこにMac用の方法がそこにiPhoneのための "描画パフォーマンスのガイドライン"であるようには思われません。私のメモは2008年のセッションですが、WWDC 2009 Session#132(iPhone Views and Animations)にアクセスすることをお勧めします。 GCLayerとdrawRectについては、CGGradientとCGPathはCPUが高価なため、バッテリが高価になるという問題があります。したがって、実際には避けてください。彼らはもちろん禁止されていません:D –

1

-(void)drawRect:(CGRect)rectの方法で自分のパスを作成しているとします。UIViewサブクラスです。

内のdrawRectあなたが例from lecture 5 cs193pCGContextRef)UIGraphicsGetCurrentContext(void);

を呼び出すことにより、グラフィックコンテキストへのアクセスを取得することができます:

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    [[UIColor grayColor] set]; 
    UIRectFill ([self bounds]); 
    CGContextBeginPath (context); 
    CGContextMoveToPoint (context, 75, 10); 
    CGContextAddLineToPoint (context, 10, 150); 
    CGContextAddLineToPoint (context, 160, 150); 
    CGContextClosePath (context); 
    [[UIColor redColor] setFill]; 
    [[UIColor blackColor] setStroke]; 
    CGContextDrawPath (context, kCGPathFillStroke); 
} 
関連する問題