-->

UICollectionView布局问题(UICollectionView Layout Issue

2019-08-31 06:00发布

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

我已经确定了细胞的大小是正确的

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

Answer 1:

我发现,用storyboards ,你必须去到storyboard ,然后点击整体View Controller (认为应该以蓝色高亮显示),然后转到Attributes Inspector (在屏幕的右侧的第四个选项卡),并取消选中在“根据热门酒吧”,“在底部的酒吧”,并“在不透明吧。” 该清理的问题,对我来说,它清除了我的同事也是如此。



Answer 2:

在使用集合视图呈现全屏视图控制器时,我一直有一些问题。

基本上,在运行时,它会要求项目的规模和简单地返回集合视图的大小:

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


Answer 3:

我知道这是一个非常晚的答复,但我也遇到过。

在我的视图控制器,让我们把它MyViewController我有一个UICollectionView正在使用自定义的UICollectionViewCell秒。 我采取的方法的CollectionView:布局:sizeForItemAtIndexPath我在哪里返回一个项目的大小是依赖于高度UICollectionView

MyViewController使用自动布局来控制的高度在情节串连图板制成UIViewController

这些细胞看起来很好在纵向模式时,但在横向模式时不一样。

我被无效解决我的问题UICollectionViewLayout我的UICollectionView内部viewWillLayoutSubviews方法。

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

早些时候,我曾试图无效里面的布局willAnimateRotationToInterfaceOrientation:duration ,但没有奏效。 这样做的原因可能是,对于所有视图大小尚未计算,所以我们不得不等待,直到自动布局已经完成它的魔力。 我指的是这个SO线程 。

更新雨燕4.0:

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


Answer 4:

努力创建全屏细胞收集意见时,有这个问题我自己几次。 我的问题是通过布置4" 在IB /故事板屏幕,并指定320 * 568项目大小,但在使用3.5" 的模拟器中运行屏幕,其中有480解决方案是一个高度指定的项目大小而引起代码是这样的:

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

这确保了细胞大小是在运行时正确设置。



Answer 5:

如果使用的是故事板和经销商的布局,调试这样的问题真的很难......

尝试在iPhone上显示UICollectionViewCell全屏当我有类似的问题。

大部分时间问题与小区集中的大小

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

或直接在flowLayout.itemSize。

但是...试试:

  1. 选择视图控制器:

  1. 然后取消扩展边缘选项:

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

祝好运。



Answer 6:

这固定我的问题:

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

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



Answer 7:

一定要设置正确的自动尺寸调整掩码UICollectionView和UICollectionviewcell。 这个固定我的问题的iPhone 4模拟器



Answer 8:

对我来说,我使用AKPickerView这是给我喜欢这里提到的那些警告摆一个自定义的UIView内。 我所做的一切,以消除这些警告是取消检查在属性检查器为我定制的UIView称为“自动调整子视图”的复选框。 这沉默的警告这么辛苦,我想我的记录器停止工作。



Answer 9:

我只是碰到了同样的错误消息,但对我的问题是,当我从API接收到新数据,并试图刷新我的CollectionView,调用该方法[collectionView reloadData]没有调用它的主线程上。

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



Answer 10:

我有同样的问题

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


}


Answer 11:

如果您正在加载通过容器视图+ UICollectionViewController一个的CollectionView,你可能设置在其上制约了集合视图本身的高度的容器视图中的高度约束。 就我而言,我发现collectionView.contentSize比我对我的容器视图设置约束高。

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



Answer 12:

是什么原因造成这对我来说是,我想我的电池设置为上海华盈的大小,而不是规模UICollectionView 。 简单地替换为所述上海华帧UICollectionView帧。



Answer 13:

上述修复程序都不为我做。 我用这个固定

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


文章来源: UICollectionView Layout Issue