2011-02-11 12 views
5

私はQuartz 2D Programming Guideの関連部分であると思っていますが、以下の答えを見つけることはできません。ドキュメント内のiOSについてたくさんあります):オフスクリーン描画のためのUIViewからCGLayerを作成する方法

私のアプリケーションはUIViewに図面を表示します。毎回、図面を何らかの方法で更新する必要があります。いずれかの図形の塗りつぶし色を変更してください(後で別の塗りつぶし色で再描画できるように、重要な図形にCGPathRefsを保持します)。私はその後、

CGContextRef offscreenContext = CGLayerGetContext(offscreenLayer); 

:セクション上記文献の169ページの「CGLayerした描画」で説明したように、私はそうのように、CGLayerから得るでしょうCGContextに図面全体を描画することを考えていました。 UIViewさんのdrawRectでの私のUIViewにCGLayerCGContextにオフスクリーンの私の更新を行うと描くことができます:メソッドを、そのように:私はから私のCGLayerを得るのですか、私が午前問題がある

CGContextDrawLayerAtPoint(viewContext, CGPointZero, offscreenLayer); 

を、 ?私の理解はCGLayerCreateWithContextを使ってそれを作って、それがほとんどのプロパティを継承するパラメータとしてCGContextを供給しなければならないということです。明らかに、右の文脈では、私が

CGContextRef viewContext = UIGraphicsGetCurrentContext(); 

を取得していますが、私は間違っていないよ場合は、私が唯一drawRect以内にそれを得ることができることを、UIViewの文脈のようになります。この方法、あることを前提として有効ではありません私がそこに与えた文脈は、メソッドが呼び出された次回と同じものになります。つまり、メソッド内でローカルにしか使用できません。

だから、どのように私は私がに描き、その後、戻って私のUIView年代CGContextに層全体を描画するオフスクリーンCGContextを作成するために、私のCGLayerを初期化するために使用することができますCGContextを得ることができますか?

PS:あなたはそれにいる間です。上記の何かが理にかなっていない、または正気でない場合は、私に知らせてください。私はQuartz 2Dの周りに頭を浮かべています。

答えて

1

まず、iOS環境でやっているのなら、あなたは正しいと思います。ドキュメントは明らかにCGContextRefを得るための唯一の方法は、

CGContextRef ctx = UIGraphicGetCurrentContext(); 

次にあなたが

CGLayerRef layer = CGLayerCreateWithContext(ctx, (CGSize){0,0}, NULL); 

CGLayerを作成するための、そのコンテキストを使用していて、その層の上に描画したい場合、あなたが持っていることであると述べましたレイヤーから取得したコンテキストで描画します。 (以前CGLayerを作成するために渡したコンテキストとは多少異なります)。 CGLayerCreateWithContextを推測しているImは、渡されたコンテキストから取得できる情報を保存しますが、すべてではありません。 (例の1つはColorSpace情報です。文脈で何かを入力するときには、CGLayerから再指定する必要があります)。

CGLayerGetContext()関数からCGLayerコンテキストリファレンスを取得して描画することができます。

CGContextRef layerCtx = CGLayerGetContext(layer); 
CGContextBeginPath(layerCtx); 
CGContextMoveToPoint(layerCtx, -10, 10); 
CGContextAddLineToPoint(layerCtx, 100, 10); 
CGContextAddLineToPoint(layerCtx, 100, 100); 
CGContextClosePath(layerCtx); 

私が知った1つのポイントは、オフスクリーンで何かを描くと、オフスクリーンのものを自動的にクリップすることです。 (意味をなさないので、見えないものを描画しませんが)レイヤを移動すると(マトリックス変換を使用して)レイヤを移動します。クリップされたパスは表示されません(不足しています)。

最後に一つ、あなたが変数に層への参照を保存し、それを描きたい、後に、あなたは

CGContextDrawLayerAtPoint(ctx, (CGPoint) {newPointX, newPointY}, layer); 

ようCGContextDrawLayerAtPoint()メソッドを使用することができるかどうかは、「stampt」のようなものでしょうか」そのnewPointXと新しいPointY座標でレイヤーを描画します。

あなたの質問にお答えしたいと思いますが、私に知らせてください。

+0

私はCGLayerの問題に悩まされていますが、私の感動的な機能でそれを書く方法を理解していません。あなたは私の投稿を見てください。http://stackoverflow.com/questions/11341763/how-to- – Ranjit

+0

CGContextBeginPath()とCGContextClosePath()は、コンテキストのパラメータをとります。 – Ant

関連する問題