142

iPhone でビューの遷移をアニメーション化するためのベスト プラクティスと考えられるものは何ですか?

たとえば、ViewTransitionsapple のサンプル プロジェクトでは、次のようなコードが使用されています。

CATransition *applicationLoadViewIn = [CATransition animation];
[applicationLoadViewIn setDuration:1];
[applicationLoadViewIn setType:kCATransitionReveal];
[applicationLoadViewIn setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]];
[[myview layer] addAnimation:applicationLoadViewIn forKey:kCATransitionReveal];

しかし、次のようなコード スニペットもネット上に出回っています。

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.75];
[UIView setAnimationDelegate:self];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:myview cache:YES];
[myview removeFromSuperview];
[UIView commitAnimations];

最善のアプローチは何ですか?スニペットも提供していただければ幸いです。

注: 2 番目の方法を正しく機能させることができませんでした。

4

8 に答える 8

119

メソッドに関するUIView リファレンスのセクションからbeginAnimations:context::

この方法は、iPhone OS 4.0 以降では使用しないことをお勧めします。代わりに、ブロックベースのアニメーション メソッドを使用する必要があります。

トムのコメントに基づくブロックベースのアニメーションの例

[UIView transitionWithView:mysuperview 
                  duration:0.75
                   options:UIViewAnimationTransitionFlipFromRight
                animations:^{ 
                    [myview removeFromSuperview]; 
                } 
                completion:nil];
于 2010-08-09T15:02:30.417 に答える
69

私は後者を多くの素晴らしい軽量アニメーションに使用してきました。2 つのビューをクロスフェードしたり、一方を他方の前にフェードインしたり、フェードアウトしたりできます。バナーのように別のビューを撮影したり、ビューを伸ばしたり縮小したりできます... beginAnimation/から多くのマイレージを取得していcommitAnimationsます。

自分にできることは次のことだけだと思わないでください。

[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:myview cache:YES];

以下にサンプルを示します。

[UIView beginAnimations:nil context:NULL]; {
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationDelegate:self];
    if (movingViewIn) {
// after the animation is over, call afterAnimationProceedWithGame
//  to start the game
        [UIView setAnimationDidStopSelector:@selector(afterAnimationProceedWithGame)];

//      [UIView setAnimationRepeatCount:5.0]; // don't forget you can repeat an animation
//      [UIView setAnimationDelay:0.50];
//      [UIView setAnimationRepeatAutoreverses:YES];

        gameView.alpha = 1.0;
        topGameView.alpha = 1.0;
        viewrect1.origin.y = selfrect.size.height - (viewrect1.size.height);
        viewrect2.origin.y = -20;

        topGameView.alpha = 1.0;
    }
    else {
    // call putBackStatusBar after animation to restore the state after this animation
        [UIView setAnimationDidStopSelector:@selector(putBackStatusBar)];
        gameView.alpha = 0.0;
        topGameView.alpha = 0.0;
    }
    [gameView setFrame:viewrect1];
    [topGameView setFrame:viewrect2];

} [UIView commitAnimations];

ご覧のとおり、ビューのアルファ、フレーム、さらにはサイズで遊ぶことができます。遊んでください。その機能に驚くかもしれません。

于 2009-05-04T08:22:52.517 に答える
52

違いは、アニメーションに対して必要な制御の量のようです。

このCATransitionアプローチにより、より多くの制御が可能になるため、設定する項目が増えます。タイミング機能。オブジェクトであるため、後で保存したり、リファクタリングしてすべてのアニメーションをオブジェクトに向けたりして、重複するコードを減らすことができます。

クラス メソッドは、一般的なアニメーションのUIView便利なメソッドですが、より制限されていCATransitionます。たとえば、可能なトランジション タイプは 4 つだけです (左にフリップ、右にフリップ、上にカール、下にカール)。フェードインを行いたい場合は、掘り下げてフェード トランジションを行うか、のアルファのCATransition's明示的なアニメーションを設定する必要があります。UIView

CATransitionMac OS X ではCoreImage、トランジションとして使用する任意のフィルターを指定できることに注意してくださいCoreImage

于 2009-03-10T15:24:45.003 に答える
26

この単純なコードを使用して、ios 5 で画像をアニメーション化できます。

CGRect imageFrame = imageView.frame;
imageFrame.origin.y = self.view.bounds.size.height;

[UIView animateWithDuration:0.5
    delay:1.0
    options: UIViewAnimationCurveEaseOut
    animations:^{
        imageView.frame = imageFrame;
    } 
    completion:^(BOOL finished){
        NSLog(@"Done!");
    }];
于 2012-01-20T09:10:50.820 に答える
8

ドキュメントで、ios4+UIViewのこの機能について読んでください。

+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion
于 2011-10-11T10:19:40.520 に答える
6

とにかく、「ブロック」方法が現在好まれています。以下に簡単なブロックを説明します。

以下の抜粋を検討してください。bug2 と bug 3 は imageView です。以下のアニメーションは、1 秒の遅延後に 1 秒間継続するアニメーションを示しています。バグ 3 は、その中心からバグ 2 の中心に移動します。アニメーションが完了すると、「Center Animation Done!」と記録されます。

-(void)centerAnimation:(id)sender
{
NSLog(@"Center animation triggered!");
CGPoint bug2Center = bug2.center;

[UIView animateWithDuration:1
                      delay:1.0
                    options: UIViewAnimationCurveEaseOut
                 animations:^{
                     bug3.center = bug2Center;
                 } 
                 completion:^(BOOL finished){
                     NSLog(@"Center Animation Done!");
                 }];
}
于 2012-03-08T04:12:12.523 に答える
2

これがSmoothアニメーションのコードです。
このチュートリアルからこのコードのスニペットを見つけました。

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[animation setAutoreverses:YES];
[animation setFromValue:[NSNumber numberWithFloat:1.3f]];
[animation setToValue:[NSNumber numberWithFloat:1.f]];
[animation setDuration:2.f];
[animation setRemovedOnCompletion:NO];

[animation setFillMode:kCAFillModeForwards];
[[self.myView layer] addAnimation:animation forKey:@"scale"];/// add here any Controller that you want t put Smooth animation.
于 2013-07-03T07:19:52.550 に答える