1

それぞれ個別の 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"];
}
4

1 に答える 1

0

まず、コードを大幅に圧縮して読みやすくすることができます。

- (CALayer *) createImageLayer:(CGPoint)orig Center:(CGPoint)pos 
{    
    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;

    childLayer1.backgroundColor = [[UIColor whiteColor] CGColor];
    childLayer2.backgroundColor = [[UIColor whiteColor] CGColor];

    childLayer1.contents=(id)[[UIImage imageNamed:@"back.png"] CGImage];
    childLayer2.contents=(id)[[UIImage imageNamed:@"fill.png"] CGImage];

    [[self layer] addSublayer:childLayer1];
    [[self layer] addSublayer:childLayer2];

    return parentLayer;
}

次に、タイマーを作成するのではなく、単に-performSelector:withObject:afterDelayを使用することをお勧めします。その後、 afterDelay パラメータをずらすだけで、すべてのアニメーションを一度に追加できます。このようなもの:

int i = 0;
for (i = 0; i < 10; ++i)
{
    [self performSelector:@selector(fadeAnimation:) 
               withObject:images[i] 
               afterDelay:(CGFloat)i];
}

images は ImageClass オブジェクトの C 配列です。もちろん、C 配列を使用する必要はありません。NSArray を使用することもできますが、afterDelay パラメーターにはカウンターが必要です。これにより、アニメーションが 1 秒ごとにずれて発生します。あなたが何を望んでいるのか正確にはわからないので、例としてこれを示しています。

Core Animation で求めていることを実行する方法は他にもあります。アニメーションのグループ化とbeginTimeプロパティを見ることができますが、前述の -peformSelector メソッドは抵抗の少ない方法だと思います。

よろしくお願いします

于 2010-06-22T17:50:14.467 に答える