1

いくつかの CALayer の位置のアニメーションを実行したいと考えています。アニメーションが終了する前に、別のコントローラーをプッシュしUIViewControllerて、この最後の UIView コントローラーをポップするとCALayers元の位置に戻るようにします。これは私のコードです:

CABasicAnimation *animation4 = [CABasicAnimation animationWithKeyPath:@"position"];
animation4.fromValue = [control.layer valueForKey:@"position"];

CGPoint endPoint4=CGPointMake(512, -305);

animation4.toValue =[NSValue valueWithCGPoint:endPoint4];
animation4.duration=1;
[control.layer addAnimation:animation4 forKey:@"position"];

[self performSelector:@selector(goToSolutionViewController) withObject:nil afterDelay:0.9];

そしてgoToSolutionViewController私は持っています:

-(void)goToSolutionViewController{

    SolutionViewController *solution=[self.storyboard instantiateViewControllerWithIdentifier:@"SolutionViewID"];

    [self.navigationController pushViewController:solution animated:NO];

}

問題はそれです

[self performSelector:@selector(goToSolutionViewController) withObject:nil afterDelay:0.9]

アニメーションが終了するまで呼び出されません。SogoToSolutionViewControllerは 0.9 秒ではなく 1.9 秒後に呼び出されます。

アニメーションが終了する前に UIViewController をプッシュするにはどうすればよいですか? または、CALayersポップしたときに元の位置に戻るようにUIViewControllerしますが、ユーザーは戻る方法を見ることができません。

編集: - -

このパフォーマンスの問題は、アニメーションを初めて実行して UIViewcontroller をプッシュしたときにのみ発生します。ポップしてすべてをやり直すと、パフォーマンスは幽霊のようです。問題は、初回の UIViewController ロード時間にある可能性があります。

4

1 に答える 1

1

遅延後に実行するのと比較して、アニメーションのタイミングに依存する代わりに、アニメーション コールバックの 1 つを使用してメソッドを呼び出す必要があります。ブロックを使用できる CATransaction を使用するか、通常のデリゲート メソッドを使用できます。

CATransaction の使用

トランザクションでアニメーションをラップする (レイヤーに追加する) ことで、トランザクションの完了ブロックを使用できます。

[CATransaction begin];
// Your animation here...
[CATransaction setCompletionBlock:^{
    // Completion here...
}];
[CATransaction commit];

デリゲート コールバックの使用

自分自身をアニメーション デリゲートとして設定すると、アニメーションの終了時にデリゲート コールバックを取得できます。

animation4.delegate = self;

そしてコールバック

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
    // Completion here..
}
于 2013-01-14T13:48:22.363 に答える