web-dev-qa-db-ja.com

UICollectionViewレイアウトの問題

フローレイアウトを使用して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.

セルのサイズが正しいことを確認しました

誰でもこの問題を解決できましたか。

60
Nitesh

storyboardsを使用して、storyboardに移動し、View Controller(ビューを青で強調表示する必要があります)、Attributes Inspector(画面の右側の4番目のタブ)および[上部バーの下]、[下部バーの下]、および[不透明バーの下]のチェックを外します。これで問題が解決し、同僚にも問題が解決しました。

38
Connor Wagner

コレクションビューを使用してフルスクリーンビューコントローラーを表示する場合、いくつかの問題があります。

基本的に、実行時に、アイテムのサイズを要求し、単にコレクションビューのサイズを返します。

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    return self.collectionView.frame.size;
}
28
ninjaneer

これは非常に遅い返信であることは知っていますが、これも経験しています。

私のView Controller内で、それを呼び出しましょうMyViewControllerカスタムUICollectionViewsを使用しているUICollectionViewCellがあります。メソッドを実装しています collectionView:layout:sizeForItemAtIndexPath ここで、UICollectionViewの高さに依存するアイテムのサイズを返します。

MyViewControllerは、オートレイアウトを使用してUIViewControllerの高さを制御するストーリーボードで作成されます。

ポートレートモードではセルはきれいに見えますが、ランドスケープモードではセルは見えませんでした。

UICollectionViewLayoutメソッド内のUICollectionViewviewWillLayoutSubviewsを無効にすることで問題を解決しました。

- (void)viewWillLayoutSubviews {
    [self.myCollectionView.collectionViewLayout invalidateLayout];
}

以前、willAnimateRotationToInterfaceOrientation:duration内のレイアウトを無効にしようとしていましたが、うまくいきませんでした。これはおそらく、すべてのビューのサイズがまだ計算されていないため、自動レイアウトがそのマジックを完了するまで待つ必要があるためです。 this SO thread を参照します。

Swift 4.0:の更新

  override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.myCollectionView.collectionViewLayout.invalidateLayout()
  }
26
Sajjon

フルスクリーンセルを使用してコレクションビューを作成しようとしたときに、この問題を数回繰り返しました。私の問題は、IB/Storyboardの4インチ画面にレイアウトし、アイテムサイズに320 * 568を指定したが、高さ480の3.5インチ画面を使用してシミュレータで実行したために発生しました。次のようなコード:

UICollectionViewFlowLayout *layout = (id) self.collectionView.collectionViewLayout;
layout.itemSize = self.collectionView.frame.size;

これにより、実行時にセルサイズが正しく設定されます。

18
Jonathan Crooke

ストーリーボードと自動レイアウトを使用している場合、この種の問題のデバッグは非常に困難です...

IPhoneでUICollectionViewCellフルスクリーンを表示しようとすると、同様の問題が発生しました。

ほとんどの場合、問題はセルのサイズの設定です

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)

または直接flowLayout.itemSizeで。

しかし...試してください:

  1. ViewControllerを選択します。

Selecting View Controller

  1. 次に、「エッジを延長」オプションのチェックを外します。

Disable Extend Edges Options

そして、自動レイアウト制約を設定してみてください。

幸運を。

10
DarkoM

それは私の問題を修正しました:

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
return CGSizeMake(self.collectionView.frame.size.width, self.collectionView.frame.size.height - 70);
}

Uは、この画面の上下からパディング値を確認できます。

enter image description here

3
Nik Kov

UICollectionViewおよびUICollectionviewcellの正しい自動サイズ変更マスクを設定してください。これにより、iPhone 4シミュレーターの問題が修正されました

2
Oleg Prymak

私にとっては、カスタムUIView内でAKPickerViewを使用しているため、ここで説明したような多数の警告が表示されました。警告を削除するために行ったのは、カスタムUIViewの属性インスペクターで「サブビューの自動サイズ変更」というボックスのチェックを外すことだけでした。それは警告を非常に激しく沈黙させたので、私のロガーは動作しなくなったと思いました。

enter image description here

2
Dave Levy

これを引き起こしたのは、セルをUICollectionViewのサイズではなくスーパービューのサイズに設定しようとしていたことです。スーパービューフレームをUICollectionViewフレームに置き換えるだけです。

1
spogebob92

私はちょうど同じエラーメッセージに遭遇しましたが、私にとって問題は、APIから新しいデータを受信して​​collectionViewを更新しようとしたときに、[collectionView reloadData]を呼び出すメソッドがメインスレッドでそれを呼び出していなかったということでした.

これが誰かを助けることを願っています...

1
SeanT

同じ問題があります

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);


}
1

コンテナビュー+ UICollectionViewControllerを使用してcollectionViewを読み込む場合、コレクションビュー自体の高さを制限しているcontainerビューに高さ制限を設定している可能性があります。私の場合、collectionView.contentSizeは、コンテナビューに設定した制約よりも高いことがわかりました。

明らかにこれは少しの場合ですが、同様の設定がある場合に備えて、このコメントを追加することを考えました。

0
the_dude_abides