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

39

我发现,使用storyboards,您必须进入storyboard并单击整体View Controller(视图应以蓝色突出显示)并转到Attributes Inspector(屏幕右侧的第四个选项卡)并取消选中“顶部栏下” 、“在底部条下”和“在不透明条下”。这为我解决了问题,也为我的同事解决了问题。

于 2014-01-11T02:27:24.883 回答
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使用自定义UICollectionViewCell的。我正在实现方法collectionView:layout:sizeForItemAtIndexPath,我在其中返回一个项目大小,该大小取决于UICollectionView.

MyViewController是在故事板中使用自动布局来控制UIViewController.

在纵向模式下,单元格看起来很好,但在横向模式下却没有。

UICollectionViewLayout我通过使我的UICollectionView内部viewWillLayoutSubviews方法无效来解决我的问题。

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

早些时候我曾试图使里面的布局无效willAnimateRotationToInterfaceOrientation:duration,但没有奏效。原因可能是所有视图的尺寸还没有计算出来,所以我们必须等到自动布局完成它的魔力。我指的是这个 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. 选择视图控制器:

选择视图控制器

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

您可以在此屏幕上从顶部和底部看到填充值:

在此处输入图像描述

于 2016-03-02T16:11:19.917 回答
2

请务必为 UICollectionView 和 UICollectionviewcell 设置正确的自动调整大小掩码。这解决了我对 iPhone 4 Simulator 的问题

于 2013-07-22T16:51:42.337 回答
2

对我来说,我在自定义 UIView 中使用 AKPickerView,这给了我一系列警告,就像这里提到的一样。我为消除警告所做的只是取消选中我的自定义 UIView 的属性检查器中名为“AutoResize Subviews”的框。这使警告变得如此难以消除,我以为我的记录器停止了工作。

在此处输入图像描述

于 2015-12-22T00:18:48.380 回答
2

造成这种情况的原因是我试图将单元格设置为超级视图的大小,而不是UICollectionView. 简单地用框架替换了superviewUICollectionView框架。

于 2018-05-19T21:50:55.147 回答
1

我刚刚遇到了同样的错误消息,但对我来说,问题是当我从 api 收到新数据并尝试刷新我的 collectionView 时,调用的方法[collectionView reloadData]没有在主线程上调用它。

希望这可以帮助某人...

于 2015-03-13T19:01:20.557 回答
1

我有同样的问题

未定义 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);


}
于 2015-06-12T13:09:18.683 回答
0

当我在 collectionView 中需要全屏单元格时,我遇到了这个问题。所以我用这个决定解决了它。

  1. 单元格大小等于集合视图大小

在此处输入图像描述 2. 故事板“Inset from:”从 Safe Area 更改为 Content Inset

在此处输入图像描述

  1. 将“内容插入”更改为从不 在此处输入图像描述
于 2021-10-29T10:13:58.943 回答
0

对我来说,解决方案是Estimate Size(在故事板大小属性窗格中)将集合视图设置为None.

于 2020-04-30T15:53:58.257 回答
0

如果您通过容器视图 + UICollectionViewController 加载集合视图,您可能已经在容器视图上设置了高度约束,这限制了集合视图本身的高度。就我而言,我发现 collectionView.contentSize 比我在容器视图上设置的约束要高。

显然这是一个边缘案例,但以防万一你有类似的设置,我想我会添加这个评论。

于 2016-09-21T21:04:32.870 回答
0

它抱怨项目高度大于collectionView的高度。所以它很突出。所以你必须使高度相同或更少。像这样:

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: collectionView.frame.height, height: collectionView.frame.height)
    
}

使用高度作为宽度使其成为正方形。这是假设 inset 是 0,如果你没有做任何事情,它应该是 0。

于 2020-12-02T16:39:19.157 回答
-3

上述修复都没有为我做。我用这个修复了它

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{CGFloat currentWidth = collectionView.frame.size.width;
UIEdgeInsets sectionInset = [(UICollectionViewFlowLayout *)collectionView.collectionViewLayout sectionInset]; //here the sectionInsets are always = 0 because of a timing issue so you need to force set width of an item a few pixels less than the width of the collectionView.

CGFloat width = currentWidth - 10;
}
于 2015-01-08T17:07:41.400 回答