2013-06-24 20 views
6

ユーザーが何らかのアクションを実行したときに、UICollectionViewを特定の高さまで引き上げる必要があります。その新しい状態は完全にオプションなので、コレクションビューはそのように表示される直前に作成されます。下から上へのアニメーションは、NSLayoutConstraintのconstantプロパティへの変更と、アニメーションブロック内の[view layoutIfNeeded]の呼び出しを使用して実行されます。UICollectionViewを表示するときにUICollectionViewCellアニメーションが表示されないようにする

問題は、そのようにすると、セルが望ましくない方法で表示されることです。つまり、左上隅から指定されたサイズに拡大されます。コレクションビューが表示され、そのセルのすべてが最終的なサイズと外観で既にレイアウトされていることを望みます。

私はUIViewのsetAnimationEnabled:メソッドのようなことを認識していますが、どうすればどこで使用するべきかがわかりません。

この問題は、コレクションビューのセルが[superview layoutIfNeeded]の呼び出しを含むアニメーションブロックの直前のビュー階層に追加されていることが原因であると考えられます。これにより、おそらくUIKitは、のレイアウトをアニメーション化する必要があると考えるようになります。そうであれば、ソリューションはおそらく、アニメーションから除外する方法に沿ったものであり、ビュー階層への特定の変更です。

+0

は私のアプリケーションでいくつかの類似したバグに実行を参照してくださいになります追加しました例えば、私がシミュレータで起動すると、アプリ全体の画面が左上隅から外側に広がり、ある種のテキストがスーパービューの左隅に「ジャンプ」してから、所定の場所にアニメートされます。同様に私は、アプリケーションのさまざまな部分でいくつかのアニメーションを拘束しています。この質問への答えを感謝します:) –

答えて

10

通常、元のビューが一度もレイアウトされていない場合は、アニメーションブロック内でlayoutIfNeededを呼び出すという症状があります。基本的に初期レイアウトパスをアニメーション化しています。そこでは、すべてのサブビューがCGRectZeroで開始されています。

  • あなたが編集している制約がコレクションビューではなく、サイズの位置に関連していることを確認:あなたは二つのものが必要とそれを解決するために

    。これは、高さをゼロから最終値に変更してコレクションビューを表示していないことを意味します。

  • 制約を編集する前に、ビューでlayoutIfNeededを呼び出してから、変更を加えた後に再度アニメーションブロックで呼び出す必要があります。この方法では、レイアウト全体ではなく、指定した変更をアニメーション化するだけです。
+1

それは働いた!どうもありがとうございます!参考までに、コレクションビューの高さをウィンドウの高さと同じにする優先度の低い制約を作成し、 'layoutIfNeeded'を呼び出し、前の設定を上書きする高優先度制約を設定し、アニメーションを実行しました!そしてそれは美しく働いた! – matehat

+0

私は22時間で賞金を獲得できます... – matehat

+0

優先順位を利用することは素晴らしいアイデアです!私は自分自身のようなものを書こうとしていますが、私は通常、さまざまな制約について言及していますが、今度は自分のやり方で試してみます。 – jrturton

0

私は約3日間この問題に遭遇し、最終的に解決策を得ました。以下のために - は単に私が

UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 7 , options: .CurveEaseInOut, animations: { 
      self.view.layoutIfNeeded() 
     }){ _ in} 

非常に小さなタイマーの後に呼び出されるアニメーションブロックは

let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC))) 
    dispatch_after(delayTime, dispatch_get_main_queue()) { 
     self.changeConstraint() 
    } 

private func changeConstraint(){ 

     UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 7 , options: .CurveEaseInOut, animations: { 
      self.view.layoutIfNeeded() 
     }){ _ in} 
} 

魔法:)

関連する問題