フローレイアウトを使用してUICollectionView
を使用しています。同じためにカスタムUICollectionViewCell
を作成しました。しかし、プロジェクトを実行すると、コンソールはこのエラーをスローし続けます-
The behavior of the UICollectionViewFlowLayout is not defined because:
the item height must be less that the height of the UICollectionView minus the section insets top and bottom values.
セルのサイズが正しいことを確認しました
誰でもこの問題を解決できましたか。
storyboards
を使用して、storyboard
に移動し、View Controller
(ビューを青で強調表示する必要があります)、Attributes Inspector
(画面の右側の4番目のタブ)および[上部バーの下]、[下部バーの下]、および[不透明バーの下]のチェックを外します。これで問題が解決し、同僚にも問題が解決しました。
コレクションビューを使用してフルスクリーンビューコントローラーを表示する場合、いくつかの問題があります。
基本的に、実行時に、アイテムのサイズを要求し、単にコレクションビューのサイズを返します。
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
return self.collectionView.frame.size;
}
これは非常に遅い返信であることは知っていますが、これも経験しています。
私のView Controller内で、それを呼び出しましょうMyViewControllerカスタムUICollectionView
sを使用しているUICollectionViewCell
があります。メソッドを実装しています collectionView:layout:sizeForItemAtIndexPath ここで、UICollectionView
の高さに依存するアイテムのサイズを返します。
MyViewControllerは、オートレイアウトを使用してUIViewController
の高さを制御するストーリーボードで作成されます。
ポートレートモードではセルはきれいに見えますが、ランドスケープモードではセルは見えませんでした。
UICollectionViewLayout
メソッド内のUICollectionView
のviewWillLayoutSubviews
を無効にすることで問題を解決しました。
- (void)viewWillLayoutSubviews {
[self.myCollectionView.collectionViewLayout invalidateLayout];
}
以前、willAnimateRotationToInterfaceOrientation:duration
内のレイアウトを無効にしようとしていましたが、うまくいきませんでした。これはおそらく、すべてのビューのサイズがまだ計算されていないため、自動レイアウトがそのマジックを完了するまで待つ必要があるためです。 this SO thread を参照します。
Swift 4.0:の更新
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.myCollectionView.collectionViewLayout.invalidateLayout()
}
フルスクリーンセルを使用してコレクションビューを作成しようとしたときに、この問題を数回繰り返しました。私の問題は、IB/Storyboardの4インチ画面にレイアウトし、アイテムサイズに320 * 568を指定したが、高さ480の3.5インチ画面を使用してシミュレータで実行したために発生しました。次のようなコード:
UICollectionViewFlowLayout *layout = (id) self.collectionView.collectionViewLayout;
layout.itemSize = self.collectionView.frame.size;
これにより、実行時にセルサイズが正しく設定されます。
ストーリーボードと自動レイアウトを使用している場合、この種の問題のデバッグは非常に困難です...
IPhoneでUICollectionViewCellフルスクリーンを表示しようとすると、同様の問題が発生しました。
ほとんどの場合、問題はセルのサイズの設定です
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)
または直接flowLayout.itemSizeで。
しかし...試してください:
そして、自動レイアウト制約を設定してみてください。
幸運を。
それは私の問題を修正しました:
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
return CGSizeMake(self.collectionView.frame.size.width, self.collectionView.frame.size.height - 70);
}
Uは、この画面の上下からパディング値を確認できます。
UICollectionViewおよびUICollectionviewcellの正しい自動サイズ変更マスクを設定してください。これにより、iPhone 4シミュレーターの問題が修正されました
これを引き起こしたのは、セルをUICollectionView
のサイズではなくスーパービューのサイズに設定しようとしていたことです。スーパービューフレームをUICollectionView
フレームに置き換えるだけです。
私はちょうど同じエラーメッセージに遭遇しましたが、私にとって問題は、APIから新しいデータを受信してcollectionViewを更新しようとしたときに、[collectionView reloadData]
を呼び出すメソッドがメインスレッドでそれを呼び出していなかったということでした.
これが誰かを助けることを願っています...
同じ問題があります
uICollectionViewFlowLayoutの動作は定義されていません。なぜなら、アイテムの高さは、UICollectionViewの高さからセクションインセットの上下の値を引いた値よりも小さくなければならないからです。
セクションInsetsの値を確認してこの問題を解決しました。セルサイズを修正するために、以下のコードを使用しました。
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
CGSize result = [[UIScreen mainScreen] bounds].size;
CGFloat scale = [UIScreen mainScreen].scale;
result = CGSizeMake(result.width * scale, result.height * scale);
CGFloat cellWidth = [[UIScreen mainScreen] bounds].size.width - 20;
CGFloat cellHeight = [[UIScreen mainScreen] bounds].size.height - 120;
return CGSizeMake(cellWidth, cellHeight);
}
コンテナビュー+ UICollectionViewControllerを使用してcollectionViewを読み込む場合、コレクションビュー自体の高さを制限しているcontainerビューに高さ制限を設定している可能性があります。私の場合、collectionView.contentSizeは、コンテナビューに設定した制約よりも高いことがわかりました。
明らかにこれは少しの場合ですが、同様の設定がある場合に備えて、このコメントを追加することを考えました。