UIViewバウンスアニメーションを作成する方法


92

と呼ばれるUIViewの次のCATransitionがありますfinalScoreView。これにより、上から画面に入ります。

CATransition *animation = [CATransition animation];
animation.duration = 0.2;
animation.type = kCATransitionPush;
animation.subtype = kCATransitionFromBottom;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];

[gameOver.layer addAnimation:animation forKey:@"changeTextTransition"];
[finalScoreView.layer addAnimation:animation forKey:@"changeTextTransition"];

ダウンした後に1回バウンドし、その後静止するようにするにはどうすればよいですか?上から画面に入りますが、画面が下がるとバウンドします。

どんな助けでも感謝します、ありがとう!


3
iOS7以上をターゲットにしていますか?その場合、UIKit Dynamics
WDUK

回答:


144

iOS7とUIKit Dynamicsでは、アニメーションCAKeyframeAnimationsUIViewアニメーションを使用する必要がなくなりました。

見てみましょうAppleのUIKitのダイナミクスカタログアプリを。代わりに、Teehanlaxにはgithubの完全なプロジェクト含む明確で簡潔なチュートリアルがあります。ダイナミクスの詳細についてチュートリアルが必要な場合は、Ray Winderlichチュートリアルが最適です。いつものように、Appleのドキュメントは最初に立ち寄るのに最適です。ドキュメントのUIDynamicAnimatorクラスリファレンスを確認してください。

Teenhanlaxチュートリアルのコードの一部を次に示します。

self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];

UIGravityBehavior* gravityBehavior = 
                [[UIGravityBehavior alloc] initWithItems:@[self.redSquare]];
[self.animator addBehavior:gravityBehavior];

UICollisionBehavior* collisionBehavior = 
                [[UICollisionBehavior alloc] initWithItems:@[self.redSquare]]; 
collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;
[self.animator addBehavior:collisionBehavior];

UIDynamicItemBehavior *elasticityBehavior = 
                [[UIDynamicItemBehavior alloc] initWithItems:@[self.redSquare]];
elasticityBehavior.elasticity = 0.7f;
[self.animator addBehavior:elasticityBehavior];

そしてここに結果があります

スクエアバウンス

UIKit Dynamicsは、iOS7に追加された非常に強力で使いやすいツールであり、UI7から素晴らしいUIを得ることができます。

その他の例:

ボタンバウンス スライドバウンス 弾力性のあるコレクション WWDCスプリントコレクション

UIKitダイナミクスを実装する手順は常に同じです。

  1. を作成UIDynamicAnimatorして、強力なプロパティに保存します
  2. 1つ以上を作成しますUIDynamicBehaviors。各ビヘイビアーには1つ以上のアイテム(通常はアニメーション化するビュー)が必要です。
  3. で使用されているアイテムの初期状態がシミュレーションUIDynamicBehaviors内で有効な状態であることを確認してくださいUIDynamicAnimator

1
こんにちはマイケル、あなたの助けに感謝します!これは間違いなく非常に簡単に見えます!私はそれを試してみましたが、それはビューの下部に当たったとき、それは動作しますが、それは別のビューでは動作しません- stackoverflow.com/questions/21895674/... -あなたはそこに私を助けることができれば、私は大好きです!:)ありがとう
user3127576 14

2
壮大なチュートリアルですが、バウンスにはSpringWithDampingを使用した1行のコードを使用するだけです!
Fattie

2
上記のUitableviewバウンスアニメーションのコードサンプルを教えてください。私はUITableviewを試していますが、どこから始めればよいかわかりません。
Dinesh 2016年

1
UIKit Dynamicsは、事例を扱うときに最適です。しかし、それが実際のタスクになると、どれだけ生で制限されているかがわかります。大きな問題の1つはオーバーライドですUIDynamicItemBehavior(これは実際には動作であり、プロパティです)。異なる動作で異なる物理特性を使用することはできません。別のケースは、UIScrollViewのようなラバーバウンドを実装することです。これは非常に複雑です。もっと書けますが、コメントが短すぎます。
ケリン

2
完全なコードを追加してください。あなたのコードはそれを作成する方法UIDynamicAnimatorとそれに関連するオブジェクトを記述していますが、それらの使用方法には答えていません
Vyachaslav Gerchicov

261

シンプルな代替UIDynamicAnimatorのiOS 7での減衰と速度であなたに素敵なバウンス効果を与えることができます春のアニメーション(新しい強力なUIViewのブロックアニメーション)、次のとおりです。 Objective Cの

[UIView animateWithDuration:duration
  delay:delay
  usingSpringWithDamping:damping
  initialSpringVelocity:velocity
  options:options animations:^{
    //Animations
    }
  completion:^(BOOL finished) {
    //Completion Block
}];

迅速

UIView.animateWithDuration(duration,
     delay: delay,
     usingSpringWithDamping: damping,
     initialSpringVelocity: velocity,
     options: options,
     animations: {
            //Do all animations here
            }, completion: {
            //Code to run after animating
                (value: Bool) in
        })

Swift 4.0

UIView.animate(withDuration:duration,
     delay: delay,
     usingSpringWithDamping: damping,
     initialSpringVelocity: velocity,
     options: options,
     animations: {
            //Do all animations here
            }, completion: {
            //Code to run after animating
                (value: Bool) in
        })

usingSpringWithDamping 0.0 ==非常に弾力があります。1.0を指定すると、オーバーシュートせずにスムーズに減速します。

initialSpringVelocity大まかに言うと、「望ましい距離を希望の秒数で割った値」です。1.0は、1秒間に移動したアニメーションの合計距離に対応します。たとえば、アニメーションの合計距離が200ポイントで、アニメーションの開始を100 pt / sのビュー速度に一致させたい場合は、0.5の値を使用します。

より詳細なチュートリアルとサンプルアプリは、このチュートリアルにあります。これが誰かに役立つことを願っています。


2
これは、アニメーションを適切に作成するために私が作成したデモプロジェクトです。楽しい!github.com/jstnheo/SpringDampingDemo
jstn

あのデモプロジェクトに乾杯!これらは非常に鈍いので、これらの値を理解するのに役立ちます。Appleがそれらをもっと明確にしてくれたらいいのに
角兵衛

32

これは、アニメーションを適切に作成するために私が作成したデモプロジェクトです。楽しい!

SpringDampingDemo

ここに画像の説明を入力してください


あのデモプロジェクトに乾杯!これらは非常に鈍いので、これらの値を理解するのに役立ちます。Appleがそれらをもっと明確にしてくれたらいいのに
角兵衛

-1
- (IBAction)searchViewAction:(UIButton*)sender
{
  if(sender.tag == 0)
  {
    sender.tag = 1;

    CGRect optionsFrame2 = self.defaultTopView.frame;
    optionsFrame2.origin.x = -320;

    CGRect optionsFrame = self.searhTopView.frame;
    optionsFrame.origin.x = 320;
    self.searhTopView.frame = optionsFrame;

    [UIView animateWithDuration:1.0 delay:0.0 usingSpringWithDamping:0.5 initialSpringVelocity:1.0 options:0 animations:^{

        CGRect optionsFrame = self.searhTopView.frame;

        optionsFrame.origin.x = 0;
        self.searhTopView.frame = optionsFrame;
        self.defaultTopView.frame = optionsFrame2;
    } completion:^(BOOL finished) {
    }];        
}
else
{
    sender.tag = 0;

    CGRect optionsFrame2 = self.defaultTopView.frame;
    optionsFrame2.origin.x = 0;

    CGRect optionsFrame = self.searhTopView.frame;
    optionsFrame.origin.x = 320;

    [UIView animateWithDuration:1.0 delay:0.0 usingSpringWithDamping:0.5 initialSpringVelocity:1.0 options:0 animations:^{

        CGRect optionsFrame = self.searhTopView.frame;

        optionsFrame.origin.x = 320;
        self.searhTopView.frame = optionsFrame;
        self.defaultTopView.frame = optionsFrame2;
    } completion:^(BOOL finished) {
    }];
}
}

1
コードの説明やコメントはありません。これは
ロレンゾ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.