誰かが独自の内部描画ルーチンを持つスタックされた CALayer をアニメーション化しようとしている場合に備えて、コードを貼り付けることもできます
- (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」を繰り返し実行すると、このルーチンが繰り返され、更新されたパラメーターを使用してレイヤーが再描画されます。