iPhone UIViewアニメーションのベストプラクティス


142

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

たとえばViewTransitions、アップルのサンプルプロジェクトでは次のようなコードを使用しています。

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番目のアプローチを正しく機能させることができませんでした。

回答:


118

以下からのUIView参照についてのセクションbeginAnimations:context:方法:

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

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

[UIView transitionWithView:mysuperview 
                  duration:0.75
                   options:UIViewAnimationTransitionFlipFromRight
                animations:^{ 
                    [myview removeFromSuperview]; 
                } 
                completion:nil];

4
つまり、明確にするために、2番目ではなく最初のアプローチ(CATransition)を使用するということですか
Steve N

2
はい、これが最初のアプローチです(CATransition)。
NebulaFox

16
@Steven N、いいえ、UIView代わりにブロックベースのアニメーションを使用することを意味します。それらは基本的にはbeginAnimations友人と同じですが、ブロック/閉鎖機能を使用します。
Dan Rosenstark、2010年

36
はい、ヤーは正しいです。これは、ブロックアニメーションの例 [UIView transitionWithView:mysuperview duration:0.75 options:UIViewAnimationTransitionFlipFromRight animations:^{ [myview removeFromSuperview]; } completion:nil]です。詳細については、UIViewのドキュメントを確認してください。
Tom van Zummeren、2011年

3
3.1.3電話をサポートする場合を除きます。次に、ブロックを使用しないでください。
ZaBlanc、2011年

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];

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


52

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

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

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

注意CATransitionのMac OS X上で使用すると、任意指定できますCoreImage遷移として使用するフィルタを、それが今立っているとして、あなたが欠けているiPhone、上でこれを行うことはできませんCoreImage


7
これはiOS 2.0時代のアドバイスです。iOS 4.0以降を使用している場合は、ブロックベースのメソッドに関するRafael Vegaの回答を参照してください。
ライアンマクアイグ

また、CoreImageはiOS 5以降で利用できるようになりましたが、その機能の一部のみです。CoreImageトランジションをアニメーションで使用できると思いますが、iOS(5)ではカスタムCoreImageフィルターを作成できません。
アーロンアッシュ

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!");
    }];

5
これはiOS 4でも利用可能で、「ブロックベース」のアニメーションと呼ばれます。iOS 5以降に限定されません。
johnbakers

8

ではUIViewドキュメント、この機能について読み取りを持っているiOS4を+

+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion

6

とにかく、「ブロック」メソッドは、今日では優先されています。以下の簡単なブロックについて説明します。

以下の抜粋を検討してください。bug2とbug 3はimageViewsです。以下のアニメーションは、1秒の遅延の後、1秒の期間のアニメーションを示しています。bug3はその中心からbug2の中心に移動されます。アニメーションが完了すると、「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!");
                 }];
}

よろしくお願いします!!!


2
CGPoint bug3.centerをbug3Centerに割り当て、その直後にCGPoint bug2.centerを同じ変数bug3Centerに割り当てましたか?どうしてそんなことをするのか ?
pnizzle

おっと!それはタイプミスの仲間です。今更新しました。
ディープジャヤン2013年

2

これがスムーズアニメーションのコードです。多くの開発者に役立つかもしれません。
このチュートリアルのコードスニペットを見つけました。

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.

2

Swift 3を試してみましょう...

UIView.transition(with: mysuperview, duration: 0.75, options:UIViewAnimationOptions.transitionFlipFromRight , animations: {
    myview.removeFromSuperview()
}, completion: nil)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.