2009-08-01 27 views
3

どのようにこれらの両方を同じUIViewで正しく使用できますか?CALayer drawInContextとaddSublayer

私は1つのカスタム私はコンテンツとしてオーバーレイPNGの画像を設定する別のものを持っている私はdrawInContext

内のパターンを描画するのCALayerをサブクラス化しています。

私は単なる背景です。

どのようにこれらのアイテムの3つをオーバーレイするのですか?

[self.layer addSublayer:bottomLayer]; // this line is the problem 

[squaresLayer drawInContext:viewContext]; 
[self.layer addSublayer:imgLayer]; 

私がこの順番で行うと、他の2人が正しく描画します。 bottomLayerをどこに置いても、常にsquaresLayerが描画されないようにします。私が3つのレイヤーを必要とする理由は、バックグラウンドレイヤーとカスタムレイヤーの色をアニメーション化することです。最上位レイヤーは単なるグラフィカルオーバーレイです。

+0

いくつかの質問:レイヤーが描画されていないことは確かですか?それとも、描かれているが、あなたが探している結果をあなたに与えていないのですか?レイヤーはどのように重なっていますか?これらのレイヤーはすべて同じビューにする必要がありますか、またはそれらのレイヤーを別のビューに分割できますか? – Amagrammer

+0

こんにちは、彼らは同じUIViewにすることができなければなりません。私はサブビューを使うことができると思います。しかし、私は2つのカスタムレイヤーを作成して解決策を考え出しました。 "addSublayer"を介してself.layerに追加されたものは、 "drawInContext"で描画されたものの上に描画され、描画の.layerのコンテキストに直接描画されているようです。それで、私はそのコンテキストに2つのレイヤーをレンダリングし、上にimgLayerを追加しました。 NSTimerを使用してアニメーションを巻き上げる場合は、drawInContextを実行するビューをリフレッシュするように、うまく動作します。 – Michael

答えて

1

同様の場合には、誰もが自分自身の内部のドローを持って積み重ねられCALayersをアニメーション化しようとしているのコードを貼り付けかもしれませんが

- (void)drawRect:(CGRect)rect { 

    [imgLayer removeFromSuperlayer]; 

    CGFloat w = [self.blockViewDelegate w]; 
    CGFloat h = [self.blockViewDelegate h]; 

    CGFloat wb = w/4; 
    CGFloat hb = h/4; 

    CGContextRef viewContext = UIGraphicsGetCurrentContext(); 

    // Layers 

    [bottomLayer sizes:wb :hb :1]; 
    bottomLayer.frame = CGRectMake(0, 0, w, h); 
    bottomLayer.opaque = NO; 

    [topLayer sizes:wb :hb :0]; 
    topLayer.frame = CGRectMake(0, 0, w, h); 
    topLayer.opaque = NO; 

    // Overlay 

    imgLayer.frame = CGRectMake(0, 0, w, h); 
    imgLayer.opaque = NO; 
    imgLayer.opacity = 1.0f; 

    UIImage *overlay = [self.blockViewDelegate image]; 
    CGImageRef img = overlay.CGImage; 
    imgLayer.contents = (id)img; 

    // Add layers 

    [bottomLayer drawInContext:viewContext]; 
    [topLayer drawInContext:viewContext]; 
    [self.layer addSublayer:imgLayer]; 

} 

blockViewDelegateは、私は幅、高さ、および画像情報を記憶していた場合、それはあるルーチンこのUIViewのコントローラ。

topLayerとbottomLayerは、可変の色情報でビュー内にいくつかの図形を描画するカスタムUIViewサブクラスです。後で私のアニメーションでは、タイマーを使って "setNeedsDisplay"を繰り返し実行し、このルーチンを繰り返し、更新されたパラメータを使用してレイヤーを再描画します。