2012-11-13 8 views
13

私はあなたがアニメーションの有無にかかわらず何かを行うことができますケースを処理する必要があるのではなく、:UIViewアニメーションブロック:durationが0の場合、アニメーションなしと同じですか?

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

私がやりたい:

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

ではなく、それが動作するかどうか確認し、でもそれならば直接、ビューを変更する代わりに、これを使用するためのオーバーヘッドはありますか?

おかげで時間がゼロであるため

答えて

7

はい、遷移瞬時によって効果的になります。

+1

そしてませについてのより多くの思考を行う必要はありません。オーバーヘッドはありますか?すなわち、 '[UIView animateWithBlock:^(){self.view.frame = newFrame} withDuration:0]' vs 'self.view.frame = newFrame'? – hzxu

+0

フレームを最初に設定して、他のフレームと同じように動作させる必要があります。 - はい、オーバーヘッドがあります。 – PappaSmalls

+9

これをiOS 7.1.1 5Sでテストしたところ、その差は大きかった。ビューのランダムフレームを設定するには、^ animateWithBlock:^で22.85秒かかり、ブロックへの直接呼び出しで0.05秒かかりました。ただし、ユーザーとのやりとりのために少数のアニメーションコールしか実行していない場合、その違いは関係ありません。アップル社は将来的に行動を変更し、この重要なケースを最適化する可能性があることに注意してください。 – mkko

27

この場合、私が作成したいすべてのアニメーションを含むブロックを作成します。次に、アニメーションブロックをパラメータとして渡すUIViewアニメーションを実行するか、アニメーションブロックをアニメーション化するかどうかに関わらず、そのブロックを直接呼び出します。アップルのドキュメントによると、オーバーヘッド

+0

これはキーフレームで動作しません –

+0

これは洗練されたソリューションです。ありがとう。 – GeneCode

18

を避けるだろう

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

    }]; 
}else{ 
    animationBlock(); 
} 

:このような 何か

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

+1

アニメーション文が実行されてから実際には0遅延ではないかもしれませんか? – hzxu

+0

@hzxu。この効果は '[self performSelector:@selector(animate)afterDelay:0]を呼び出すのと同じです。 – chebur

+0

これは確かです。 0を使用するのは、アニメ化してすぐに実行しないことと同じではありません。 – strange

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

問題がある場合はお知らせください。

2

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

私は間違いなく同期をとっていないので、ゼロを期間として使用しないことをお勧めします。

1

私はこの問題を克服するために、この小さなスウィフト拡張を書いた:

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

関連する問題