63

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.

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

この問題を解決できた人はいますか。

4

16 に答える 16

29

コレクション ビューを使用して全画面表示のビュー コントローラーを表示するときに、いくつかの問題が発生しました。

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

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    return self.collectionView.frame.size;
}
于 2014-03-05T11:48:47.480 に答える
28

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

ビュー コントローラー内で、それをMyViewControllerと呼びましょう。UICollectionViewカスタムUICollectionViewCells を使用しています。私はメソッドcollectionView:layout:sizeForItemAtIndexPathを実装していUICollectionViewます。

MyViewControllerは、 autolayout を使用してストーリーボードで作成され、 の高さを制御しUIViewControllerます。

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

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

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

以前、 内のレイアウトを無効にしようとしましたwillAnimateRotationToInterfaceOrientation:durationが、うまくいきませんでした。これはおそらく、すべてのビューのサイズがまだ計算されていないためです。そのため、autolayout が魔法を終えるまで待つ必要があります。この SO スレッドを参照します。

Swift 4.0 の更新:

  override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.myCollectionView.collectionViewLayout.invalidateLayout()
  }
于 2014-10-07T13:02:13.290 に答える
18

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

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

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

于 2013-04-16T19:27:06.147 に答える
10

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

iPhoneでUICollectionViewCellを全画面表示しようとすると、同様の問題が発生しました。

ほとんどの場合、設定されたセルのサイズに問題があります

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

または直接flowLayout.itemSizeに。

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

  1. ViewController を選択します。

ビューコントローラーの選択

  1. 次に、[エッジの拡張] オプションをオフにします。

エッジの拡張オプションを無効にする

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

幸運を。

于 2014-06-04T13:45:59.163 に答える
3

それは私の問題を解決しました:

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

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

ここに画像の説明を入力

于 2016-03-02T16:11:19.917 に答える
1

私は同じ問題を抱えています

UICollectionViewFlowLayout の動作は次の理由で定義されていません。アイテムの高さは、UICollectionView の高さからセクション インセットの上部と下部の値を引いた値より小さくなければなりません。

セクション Insets.And の値を確認することでこの問題を解決しました。以下のコードを使用したセルサイズを修正しました。

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


}
于 2015-06-12T13:09:18.683 に答える
0

コンテナ ビュー + UICollectionViewController を介して collectionView をロードしている場合、コレクション ビュー自体の高さを制限しているコンテナビューに高さの制限を設定している可能性があります。私の場合、collectionView.contentSize が、コンテナー ビューに設定した制約よりも高くなっていることがわかりました。

明らかに、これは少し特殊なケースですが、同様の設定がある場合に備えて、このコメントを追加すると思いました.

于 2016-09-21T21:04:32.870 に答える