17

次の代わりに、アニメーションの有無にかかわらず何かを実行できる場合を処理する必要があります。

if (animation)
{
    [UIView animateWithBlock:^(){...}];
}
else
{
    ...
}

私はやってみたいです:

[UIView animateWithBlock:^(){...} duration:(animation ? duration : 0)]

しかし、それが機能するかどうかはわかりませんが、機能する場合でも、ビューを直接変更する代わりにこれを使用するためのオーバーヘッドはありますか?

ありがとう

4

6 に答える 6

30

この場合、私が行うことは、作成したいすべてのアニメーションを含むブロックを作成することです。次に、アニメーションブロックをパラメーターとして渡すか、アニメーション化するかどうかに関係なく、そのブロックを直接呼び出すUIViewアニメーションを実行します。このようなもの :

void (^animationBlock)();
animationBlock=^{
      // Your animation code goes here
};
if (animated) {
    [UIView animateWithDuration:0.3 animations:animationBlock completion:^(BOOL finished) {

    }];
}else{
    animationBlock();
}

それはオーバーヘッドを回避します

于 2012-12-29T22:52:38.227 に答える
21

Appleのドキュメントによると:

アニメーションの継続時間が0の場合、このブロックは次の実行ループサイクルの開始時に実行されます。

于 2013-03-19T06:04:34.080 に答える
8

はい、期間がゼロであるため、移行は事実上瞬時に行われます。

于 2012-11-13T22:28:01.317 に答える
4

この問題を克服するために、この小さなSwift拡張機能を作成しました。

extension UIView {

/// Does the same as animate(withDuration:animations:completion:), yet is snappier for duration 0
class func animateSnappily(withDuration duration: TimeInterval, animations: @escaping () -> Swift.Void, completion: (() -> Swift.Void)? = nil) {
    if duration == 0 {
        animations()
        completion?()
    }
    else {
        UIView.animate(withDuration: duration, animations: animations, completion: { _ in completion?() })
    }
}
}

代わりに使用でき、UIView.animate(withDuration:animations:completion)期間0についてこれ以上考える必要はありません。

于 2017-03-03T14:39:27.600 に答える
2

さて、私はこれについてさらに観察しています。まず、持続時間がゼロのアニメーションを使用するとパフォーマンスのオーバーヘッドが発生しますが、より大きな違いは、アニメーションの完了ブロックが非同期で処理されることです。これは、最初にビューを非表示にしてから表示すると、期待した結果が得られない可能性があることを意味します。

したがって、同期していないため、ゼロを期間として使用しないことを強くお勧めします。

于 2014-06-30T05:49:22.507 に答える
0

要件に応じて、animateWithDuration値を動的に設定できます。

0を設定すると、アニメーションの遷移時間がないことを意味します。したがって、ビューはアニメーションなしで表示されます。アニメーションを提供する場合は、0より大きい値を設定します。

    **float animationDurationValue=0.03f;
        [UIView animateWithDuration:x delay:0.0f options:UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse 
animations:^{
                             [yourView setFrame:CGRectMake(0.0f, 100.0f, 300.0f, 200.0f)];
                         }
                         completion:nil];**

問題があれば教えてください。

于 2013-03-19T06:14:46.337 に答える