1

ブロック アニメーションを使用して UIImageView を反転しようとしています。多くの Web サイト (および SO に関する回答) は、次のことを示唆しています。

flipTile.image = frontImage;

[UIView transitionWithView: flipTile
                  duration: 2.5f
                   options: UIViewAnimationOptionTransitionFlipFromLeft
                animations:^(void) {
                    flipTile.image = backImage;
                }
                completion:^(BOOL finished) {
                }
 ];

残念ながら、それは私が期待する結果を私に与えていません。アニメーションの前半ではまったく何も得られず、アニメーションの後半では backImage が反転して表示されます。frontImage が非表示または透明のようです-そうではありません。

移行中の何かが物事を台無しにしています。私は何を間違っていますか?

4

2 に答える 2

3

他の誰かが将来この問題に直面した場合の解決策は次のとおりです。

UIImageView簡単に言えば、アニメーション ブロックは、私の現在の状態とセクションで設定した状態の間で反転していanimationsます。flipTileただし、アニメーション ブロックが呼び出される直前に設定されるイメージでは、iOS レンダリング エンジンはUIImageView、アニメーションが開始する前に my を更新する機会がありません。UIImageViewしたがって、現在の状態( nil) から新しい状態 ( ) へのアニメーションが表示されbackImageます。

この問題を解決するには、制御を一瞬だけ iOS に戻して、レンダリング エンジンが本来の役割を果たせるようにしてから、アニメーションを実行する必要があります。

これが私がそれをした方法です:

- (void)giveHint {
    /*
        other work here
    */

    flipTile.image = currentTileImage;

    [self performSelector:@selector(flipTile) withObject:nil afterDelay: 0.1];
}

- (void)flipTile {
    [UIView transitionWithView: flipTile
                      duration: 0.5
                       options: UIViewAnimationOptionTransitionFlipFromLeft
                    animations:^{
                        flipTile.image = newTileImage;
                    }
                    completion:^(BOOL finished) {
                        /*
                            clean up
                        */
                    }
     ];
}
于 2013-02-04T03:02:23.117 に答える
1

これはまさにそのtransitionWithViewために設計されたものです。

あなたが説明する動作は、frontImage存在することの兆候ですnil(または、指摘したように、まだ初期化されていません)。有効なイメージでまだ初期化されていない状態でアニメーションを実行すると、アニメーションの前半には何も表示されず、アニメーションの後半のみが表示されます。

frontImageが であるはずがない場合は、(またはnilで) チェックします。でよい場合は、最初の画像を別の空白の画像に設定すると、そこから完全な反転をアニメーション化できます。NSAssertNSLogfrontImagenilnil

于 2013-02-03T18:46:02.593 に答える