それぞれ個別の CALayer を使用して、個別の小さな画像を多数作成しました。これらの画像は、異なる速度で非同期にフェードインおよびフェードアウトすることになっています。それぞれに背景サブレイヤーと塗りつぶしサブレイヤーがあります。タイマーがバックグラウンドで実行され、特定の瞬間にそれぞれが個別にアニメーション化されます。プログラムの現在の動作では、個々のプログラムをアニメーション化するのではなく、その周りの画面全体をアニメーション化します。一度に 1 つの画像だけをアニメーション化するようにするのを手伝ってくれませんか?
編集:私はもっと明確であるべきでした。タイミングは問題ではありません。CoreAnimation に切り替える前は、これらの画像は適切なタイミングで正しくアニメーション化されていました。しかし、ここでの主な問題は、1 つの画像をアニメーション化するように指示すると、すべての画像の外側にある画面の背景部分を含む画面全体がアニメーション化されることです。
次のコード セグメントは、UIView コードでレイヤー構造を作成するためのものです。Self はメインの UIView を参照します。戻り値は、画面上のこれらの小さな画像の 1 つを表すクラスの CALayer メンバー変数を設定するために使用されます。
- (CALayer *) createImageLayer:(CGPoint)orig Center:(CGPoint)pos {
CALayer *parentLayer = [self layer];
CALayer *childLayer1 = [CALayer layer];
childLayer1.bounds = CGRectMake(0, 0, 40.0f, 40.0f);
childLayer1.position = pos;
CALayer *childLayer2 = [CALayer layer];
childLayer2.bounds = CGRectMake(0, 0, 40.0f, 40.0f);
childLayer2.position = pos;
float components[4] = {1.0, 1.0, 1.0, 1.0};
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGColorRef whiteColor = CGColorCreate( colorSpace, components);
childLayer1.backgroundColor = whiteColor;
childLayer2.backgroundColor = whiteColor;
UIImage *childImage = [UIImage imageNamed:@"back.png"];
UIImage *childImage2 = [UIImage imageNamed:@"fill.png"];
CGImageRef imageRef = [childImage CGImage];
CGImageRef imageRef2 = [childImage2 CGImage];
childLayer1.contents=(id)imageRef;
childLayer2.contents=(id)imageRef2;
[parentLayer addSublayer:childLayer1];
[parentLayer addSublayer:childLayer2];
CGColorSpaceRelease(colorSpace);
CGColorRelease(whiteColor);
return parentLayer;
}
アニメーション化するように指示するコード。イメージ オブジェクトは、レイヤー メンバーにアニメーションを追加するように指示されます。
- (void) fadeAnimation:(ImageClass *)image {
CABasicAnimation *theAnimation;
theAnimation=[CABasicAnimation animationWithKeyPath:@"opacity"];
theAnimation.duration=1.0; // fixed duration for now
theAnimation.repeatCount=1;
theAnimation.autoreverses=YES;
theAnimation.fromValue=[NSNumber numberWithFloat:1.0];
theAnimation.toValue=[NSNumber numberWithFloat:0.0];
[image.myLayer addAnimation:theAnimation forKey:@"animateOpacity"];
}