2017-08-12 15 views
0

私はいくつかの要素を持つuiCollectionViewを持っています。私はコレクションビューの高さを知る必要がありますviewDidAppearいくつかの魔法を行うには。他の人が(viewDidAppear前に私がいることを必要とする)0を返すUICollectionViewがセルを塗りつぶし、スクロールで高さを取得するとき

​​

しかし、これが唯一のviewWillAppearとのviewDidLoad viewDidAppearにし、に真の値を返している:私は、以下のスニペットコードを使用しています。私は、collectionViewのライフサイクルと、コレクションビューの高さを決定する要素がどこにあるのかを知る必要があります。あなたがUICollectionViewの高さを知りたい場合は、呼ばれて、その後

collectionView.contentSize.height 

UICollectionViewのデータソースメソッドを使用しているどのくらいのスクロール可能な高さを知りたい場合は

答えて

1

は、コード

collectionView.frame.size.height 

を使用しますviewDidLayoutSubviews関数の直前です。

+0

私はviewDidLayoutSubviews {ここでの印刷高さ}を使用します。それは再び0を返します –

+0

@AmirShabaniあなたはこのcollectionView.frame.size.heightまたはcollectionView.contentSize.heightをログに記録しましたか? –

+0

両方とも0を返します。偶数frame.size.heightはviewDidAppearのゼロを返します –

0

UICollectionViewのロードは非同期プロセスなので、ロードが完了してからviewDidAppearが呼び出される前に確実に確認することはできません。

あなたのコレクションビューの値の変化を観察するためにKVOを使用し、値が変更されたときにあなたの魔法を実行することをお勧めします。

別のオプションは、私のPOVから「汚い」オプションが

collectionView.reloadData() 
DispatchQueue.main.async{ 
// This will be called when after reloadData() completes 
} 
0

ような何かをすることで、それをレンダリングする前に、指定された項目のセルのサイズを返し、次のUICollectionViewDelegateFlowLayout メソッドを実装します。

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
    let height = collectionView.frame.size.height 
    // Your logic 
} 
0

含むビュー(のViewControllerのビュー)がロードされる前にどのようにcollectionViewcontentSizeを得ることができます?。あなたはライフサイクルの巡回を忘れたと思う。

コントローラにサブビュー(collectionView、tableViewなど)が含まれている場合。その後、まずメイン親viewの(のviewDidLoadviewWillApper又はviewDidApper)ロードされ、その後、すべてのサブビューを直接ビュー階層に応じにロードされます。

したがって、collectionViewが完全にロードされた後でcontextSizeを完全に取得することができます。あなたがコレクションビューでいくつかの魔法のアニメーションをしたい場合は、初期化時に非表示にすることができます。そして、collectionViewがロードされた後、それを再表示してアニメーションを実行します。

関連する問題