単純なCABasicAnimationを無限のアニメーションとして配線しています(ホイールは永遠に回転し続けます)。明示的なアニメーションを設定する方法は次のとおりです。
-(void)perform360rotation:(UIImageView*) imageView {
CABasicAnimation* anim = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
// to rotate around a specific axis, specify it in the KeyPath parameter like below
//CABasicAnimation* anim = [CABasicAnimation animationWithKeyPath:@"transform.rotation.x"];
[anim setDuration:self.speed]; // Animation duration
[anim setAutoreverses:NO];
[anim setRepeatCount:HUGE_VALF]; // Perfrom animation large number of times
[anim setFromValue:[NSNumber numberWithDouble:0.0f]];
[anim setToValue:[NSNumber numberWithDouble:(M_PI * 2.0f)]];
[[imageView layer] addAnimation:anim forKey:@"wheeloRotation"];
}
このアニメーションメソッドをviewWillAppearメソッドから呼び出します。アプリがバックグラウンドに入ってから再表示されると、アニメーションは機能しなくなります。グーグルすると、私はこれをAppleから思いついた。さて、私はこのようなAppleの推奨事項を、ビューを回転させるためのperform360rotationメソッドを持つ同じviewcontroller.mファイルに実装しました。
-(void)pauseLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:[self.wheelView layer]];
layer.speed = 0.0;
layer.timeOffset = pausedTime;
NSLog(@"pauseLayer:paused time = %f",pausedTime);
}
-(void)resumeLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer timeOffset];
NSLog(@"resumeLayer:paused time = %f",pausedTime);
layer.speed = 1.0;
layer.timeOffset = 0.0;
layer.beginTime = 0.0;
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:[self.wheelView layer]] - pausedTime;
layer.beginTime = timeSincePause;
}
繰り返しになりますが、グーグルで、AppDelegateからpauseメソッドとresumeメソッドを呼び出すことが一般的なコンセンサスであることがわかりました。だから私はこのようにしました(lVCはこの質問の冒頭で述べたviewcontroller.mクラスです。pauseLayerメソッドとresumeLayerメソッドはそのviewWillAppearメソッドとviewWillDisappearメソッドの内部から呼び出されています):
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[lVC viewWillDisappear:YES];
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
[lVC viewWillAppear:YES];
}
まだサイコロはありません。アプリがフォアグラウンドに戻っても、アニメーションは再開されません。私が間違っていることはありますか?