0

画像をフェードインおよびフェードアウトする必要があり、場合によってはアニメーションを停止して反転する必要があります。例:画像はアルファ0から1にフェードインし始め、次に0.4で、ユーザー入力のために、0.4から0にフェードアウトする必要があります。

animateWithDurationとstopAllAnimationsを使用してみましたが、結果として、アニメーションがターゲットのアルファ(= 1)にジャンプしました。

CADisplayLinkを考えて、自分でフレームごとにアニメーションをやってみましたが、パフォーマンスがあまり良くないことを読みました。CALayersとPresentationLayerを使おうとしましたが、複雑になり、動作しません。

これを行うための最良の方法は何ですか?誰かが小さな例でこれを手伝ってくれる?

4

3 に答える 3

2

UIView animateWithDuration メソッドは、カバーの下のレイヤーに Core Animation オブジェクトを作成して、アニメーションを機能させます。CAAnimation は、ビューのレイヤーの presentationLayer をアニメーション化します。プレゼンテーション レイヤーをクエリして、進行中のアニメーションの状態を取得できます。

これが私が提案するものです:

現在行っているように、animateWithDuration:animations: を使用します。

途中でアニメーションを停止する必要がある場合は、ビューのレイヤーのプレゼンテーション レイヤーを取得し、アルファ プロパティの値を取得します。

次に、ビューの不透明度を「飛行中」の値に設定し、removeAllAnimations メッセージをレイヤーに送信します。これにより、アニメーションが現在の状態で停止する効果があります。

最後に、新しいリバース アニメーションで新しい animateWithDuration:animations: ステートメントを呼び出します。

于 2012-11-22T16:28:27.483 に答える
1

このコードを使用してフェードインおよびフェードアウトします

-(void)fadeOut:(UIView*)viewToDissolve withDuration:(NSTimeInterval)duration
       andWait:(NSTimeInterval)wait FadeLevel:(float) fadeLevel
{
    [UIView beginAnimations: @"Fade Out" context:nil];
    [UIView setAnimationDelay:wait];
    [UIView setAnimationDuration:duration];
    viewToDissolve.alpha = fadeLevel;
    [UIView commitAnimations];
}

-(void)fadeIn:(UIView*)viewToFadeIn withDuration:(NSTimeInterval)duration
      andWait:(NSTimeInterval)wait FadeLevel:(float) fadeLevel
{
    [UIView beginAnimations: @"Fade In" context:nil];
    [UIView setAnimationDelay:wait];
    [UIView setAnimationDuration:duration];
    viewToFadeIn.alpha = fadeLevel;
    [UIView commitAnimations];
}

フロートを取るメソッドに追加の変数を追加し、フェードインまたはフェードアウトを好きなように設定するだけです。それが役立つことを願っています!

編集:コードを変更して、どのように見えるかを示し、自分でテストしたところ、問題なく動作するようです

于 2012-11-22T14:58:40.120 に答える
0

アニメーションを停止するには、パラメータ: UIViewAnimationOptionBeginFromCurrentState を使用して新しい UIView アニメーションを呼び出し、前のアニメーションをオーバーライドします。

そのため、値 X から値 Y へのアニメーションを開始する方法が 1 つあります。最初のアニメーションを中断する別の方法があります。この 2 番目のメソッドは、[一時停止] ボタンがタップされるたびに呼び出されました。

アニメーションを再開したいときは、オブジェクトが残っていた状態からの新しい X 値と Y 値を使用して、アニメーションの開始メソッドを再度呼び出すだけです。

UIImageView オブジェクトをブロック形式でアニメーション化するコード:

[UIView animateWithDuration: 5
                      delay: 0.0
                    options: UIViewAnimationOptionCurveLinear
                 animations: ^{

                                  self.center = destinationPosition;  

                             }
                 completion:nil];

停止/中断コードは次のとおりです。

UIImageView *currentPosition = [[UIImageView alloc] initWithFrame:[[self.layer presentationLayer] frame]];

                destinationPosition.x = currentPosition.center.x;
                destinationPosition.y = currentPosition.center.y;

                [UIView animateWithDuration: 0.1
                                      delay: 0.0
                                    options: UIViewAnimationOptionCurveLinear | UIViewAnimationOptionBeginFromCurrentState
                                 animations: ^{

                                     self.center = destinationPosition;

                                 } completion:nil];

このコードでは、レイヤ プレゼンテーション メソッドを使用して、アニメーション中にオブジェクトが最後に持っていた値を把握し、ユーザーがゲームプレイを再開したときにその時点からアニメーションを開始できるようにしました。これは、オブジェクトが予測された目的地の値を格納しているように見えたため、「現時点で」の値で更新する必要があったためです。

停止アニメーション コードの持続時間は 0.1 のみであることに注意してください。つまり、新しいアニメーションが見つかった状態 (UIViewAnimationOptionBeginFromCurrentState) から初期アニメーションを上書きするようなものです。値が非常に短いため、アニメーションがあった場所でたまたま「停止」します。

これが最善の方法かどうかはわかりませんが、私にとってはうまくいきました。

于 2012-11-22T16:56:24.843 に答える