0

UIView アニメーションを利用して、ビューを画面上でスライドさせようとしています。ビューコントローラーにUIScrollViewがあり、そこにUIViewがあります。

私もこの方法を持っています:

-(void)translateView:(UIView *)view toRect:(CGRect)rect withDuration:(CGFloat)duration
{
    [UIView animateWithDuration:duration
    animations:^
    {
        view.frame = rect;
    }
    completion:^(BOOL finished)
    {
        //Finished
    }];
}

これを呼び出して、UIView をアニメーション化された方法で、特定の時間にわたって選択した CGRect に移動します。7 つのビューを作成してスライドさせるループがあります。これはうまく機能します。私はそれを以下のように呼び出します。もちろんループは異なるビューでこれを7回呼び出します:

[self translateView:cell toRect:translationRect withDuration:0.7];

ただし、すぐにこれを再度呼び出すことはできません。何も起こりません。ただし、2 秒の NSTimer の後にこれを再度呼び出すと、アニメーションは実行されますが、UIScrollView をスクロールすると、アニメーション化したばかりのビューが以前の CGRect にジャンプして戻ります。

4

1 に答える 1

4

ストーリーボードで自動レイアウトが有効になっています。自動レイアウトが実行されると、ストーリーボードで設定した(または自動的に設定された)制約に基づいてビューのフレームが設定されます。これは、ビューのフレームを変更した場合、自動レイアウトは次に実行されたときに変更を元に戻すことを意味します。

システムは、スクロールビューをスクロールするときなど、さまざまな時点で自動レイアウトを自動的にトリガーします。そのため、スクロールするとビューが「ジャンプバック」します。

自動レイアウトが必要ない場合は、オフにすることができます(オフにする方法が必要な場合は、この回答を参照してください)。次に、ストーリーボードで古い「スプリングとストラット」レイアウトシステムを使用できます。これにより、ビューのフレームを好きなように設定できます。

自動レイアウトが必要な場合は、アニメーションを自動レイアウトで機能させる方法を学ぶ必要があります。2つの基本的なアプローチがあります。1つのアプローチは、自動レイアウトがビューを目的の場所に配置するように制約を変更してから[view layoutIfNeeded]、アニメーションブロックで実行して、ビューを新しい位置にアニメーション化することです。もう1つのアプローチは、NSTimerまたはを使用して制約自体をアニメーション化することCADisplayLinkです。

WWDC 2012のビデオ「セッション228-自動レイアウトをマスターするためのベストプラクティス」では、問題について説明し、30分45秒から始まるこれら2つのテクニックについて詳しく説明します。自動レイアウトでアニメーションを使用する必要がある場合は、ビデオ、およびWWDC2012の他の自動レイアウト関連のビデオを視聴することを強くお勧めします。

于 2012-11-15T03:30:39.360 に答える