UICollectionView布局问题

问题描述 投票:58回答:13

我正在使用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.

我确保细胞的大小是正确的

有没有人能够解决这个问题。

ios uicollectionview uicollectionviewlayout
13个回答
38
投票

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


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


}

0
投票

如果您通过容器视图+ UICollectionViewController加载collectionView,则可能在容器视图上设置了一个高度约束,这限制了集合视图本身的高度。在我的例子中,我发现collectionView.contentSize高于我在容器视图上设置的约束。

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


0
投票

造成这种情况的原因是我试图将我的细胞设置为超视图的大小,而不是UICollectionView的大小。只需用UICollectionView框架替换superview框架。


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

28
投票

当使用集合视图呈现全屏视图控制器时,我遇到了一些问题。

基本上在运行时,它会询问项目的大小,并简单地返回集合视图的大小:

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

26
投票

我知道这是一个非常晚的回复,但我也经历过这个。

在我的视图控制器中,我们称之为MyViewController我有一个使用自定义UICollectionViews的UICollectionViewCell。我正在实施方法collectionView:layout:sizeForItemAtIndexPath,我返回的项目大小取决于UICollectionView的高度。

MyViewController是在故事板中使用autolayout来控制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()
  }

18
投票

尝试使用全屏单元格创建集合视图时,我自己有几次这个问题。我的问题是由于在IB /故事板中布置4“屏幕并指定320 * 568的项目大小,但在模拟器中使用3.5”屏幕运行,其高度为480.解决方案是指定您的项目大小代码类似于:

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

这可确保在运行时正确设置单元格大小。


10
投票

如果你正在使用故事板和自动布局,调试这类问题真的很难......

尝试在iPhone上显示UICollectionViewCell全屏时,我遇到了类似的问题。

大部分时间问题都与单元格的大小有关

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

或直接在flowLayout.itemSize上。

但是......试试:

  1. 选择ViewController:

  1. 然后取消选中Extend Edges选项:

现在尝试设置自动布局约束。

祝好运。


3
投票

这解决了我的问题:

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

你可以在这个屏幕上看到从顶部和底部的填充值:

enter image description here


2
投票

请务必为UICollectionView和UICollectionviewcell设置正确的自动调整掩码。这解决了iPhone 4模拟器的问题


2
投票

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

enter image description here


1
投票

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

希望这有助于某人......

© www.soinside.com 2019 - 2024. All rights reserved.