0

基本的なアニメーションがあり、画像を回転させるだけで、CoreAnimationを使用しています。viewWillAppearメソッドで、アニメーションを作成します。

gearRotate = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
gearRotate.repeatCount = HUGE_VALF;
gearRotate.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
gearRotate.duration = 2;
gearRotate.fromValue = 0;
gearRotate.toValue = [NSNumber numberWithFloat:(360*M_PI)/180];
[gearButton.imageView.layer addAnimation:gearRotate forKey:@"transform.rotation"];


[self stopGear];

最初はstopGearを呼び出して、アニメーションを一時停止します。そもそもviewDidLoadにこのコードがありました。とにかく、アニメーションが呼び出されると、正常に機能します。

-(void)startGear {
CFTimeInterval pausedTime = [gearButton.imageView.layer timeOffset];
gearButton.imageView.layer.speed = 1.0;
gearButton.imageView.layer.timeOffset = 0.0;
gearButton.imageView.layer.beginTime = 0.0;
CFTimeInterval timeSincePause = [gearButton.imageView.layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
gearButton.imageView.layer.beginTime = timeSincePause;

}

また、この一時停止方法も正常に機能します。

-(void)stopGear {
CFTimeInterval pausedTime = [gearButton.imageView.layer convertTime:CACurrentMediaTime() fromLayer:nil];
gearButton.imageView.layer.speed = 0.0;
gearButton.imageView.layer.timeOffset = pausedTime;

}

ただし、別のビューに移動してからメインビューに戻ると、これはすべて失敗します。アプリは正常に実行されますが、別のビューにアクセスした場合、アニメーションは実行されません。

これが、アニメーションを再作成する必要があると考えて、最初にこのコードをviewWillAppearに移動した理由ですが、Beanはありません。何か案は?

ありがとう。

4

2 に答える 2

0

OK、それで私はアニメーションがどのように機能するかを再考することによってこれを解決しました。これで、実行するたびにアニメーションを作成するだけです。

-(void)startGear {
    gearRotate = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
    gearRotate.repeatCount = HUGE_VALF;
    gearRotate.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
    gearRotate.duration = 2;
    gearRotate.fromValue = 0;
    gearRotate.toValue = [NSNumber numberWithFloat:(360*M_PI)/180];
    [[gearButton.imageView layer] addAnimation:gearRotate forKey:@"transform.rotation"];

}

そして、一時停止したいときは、単に削除します。

-(void)stopGear {
    [[gearButton.imageView layer] removeAnimationForKey:@"transform.rotation"];

}

これがAppleが好む方法かどうかは現時点ではわかりませんが、しっかりと機能します。

于 2012-06-27T07:36:56.293 に答える
0

を使用する代わりに、gearRotate.repeatCount = HUGE_VALF;別のView Controllerに対してセグエを実行した後もアニメーションを実行し続けるために、次のアプローチを使用することもできます。

-(void)startGear {
    [[gearButton.imageView layer] removeAnimationForKey:@"transform.rotation"];
    gearRotate = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
    gearRotate.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
    gearRotate.duration = 2;
    gearRotate.fromValue = 0;
    gearRotate.toValue = [NSNumber numberWithFloat:(360*M_PI)/180];
    [[gearButton.imageView layer] addAnimation:gearRotate forKey:@"transform.rotation"];
    [self performSelector:@selector(startGear) withObject:nil afterDelay:gearRotate.duration];
}
于 2012-09-29T20:06:41.917 に答える