web-dev-qa-db-ja.com

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

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

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

142

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

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

たとえば、トムのコメントに基づいたブロックベースのアニメーション

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

ニースの軽量アニメーションの多くに後者を使用しています。 2つのビューのクロスフェードを使用したり、一方を他方の前にフェードインしたり、フェードアウトしたりできます。バナーのように別のビューを撮影したり、ビューを伸縮したりできます... beginAnimationname __/commitAnimationsname__から多くの燃費が得られます。

あなたができることはすべてだとは思わないでください:

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

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

69
mahboudz

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

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

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

Mac OS XのCATransitionでは、トランジションとして使用する任意のCoreImageフィルターを指定できますが、現在のところ、CoreImageのないiPhoneでこれを行うことはできません。

52
Ryan McCuaig

この単純なコードを使用して、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!");
    }];
26
Guru

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

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

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

以下の抜粋を検討してください。 bug2とbug 3はimageViewです。以下のアニメーションは、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!");
                 }];
}

それがきれいなことを願っています!!!

6
Deepukjayan

このリンクで良いチュートリアルを見つけました。これが誰かにとって役立つことを願っています。

iview-animation-tutorial

4
Dilip Rajkumar

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

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
iPatel

Swift 3のチェックアウトを試してみましょう...

UIView.transition(with: mysuperview, duration: 0.75, options:UIViewAnimationOptions.transitionFlipFromRight , animations: {
    myview.removeFromSuperview()
}, completion: nil)
2
Saurabh Sharma