UICollectionView布局问题

时间:2013-04-15 10:43:53

标签: ios uicollectionview uicollectionviewlayout

我正在使用流程布局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.

我已确保单元格的大小正确

是否有人能够解决此问题。

15 个答案:

答案 0 :(得分:37)

我发现,使用storyboards,您必须进入storyboard并点击整体View Controller(视图应以蓝色突出显示)并转到{{ 1}}(屏幕右侧的第四个选项卡)并取消选中" Under Top Bars"," Under Bottom Bars"," Under Opaque Bars。& #34;这为我解决了这个问题,它也为我的同事清除了它。

答案 1 :(得分:27)

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

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

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

答案 2 :(得分:24)

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

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

MyViewController 是在故事板中使用autolayout来控制UICollectionView的高度。

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

我通过使UIViewController方法中的UICollectionViewLayout UICollectionView无效来解决我的问题。

viewWillLayoutSubviews

之前我曾尝试使- (void)viewWillLayoutSubviews { [self.myCollectionView.collectionViewLayout invalidateLayout]; } 内的布局无效,但它无法正常工作。原因可能是所有视图的大小尚未计算,所以我们必须等到自动布局完成它的魔力。我指的是this SO thread

Swift 4.0的更新:

willAnimateRotationToInterfaceOrientation:duration

答案 3 :(得分:18)

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

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

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

答案 4 :(得分:10)

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

尝试在iPhone上显示UICollectionViewCell全屏时出现类似问题。

大部分时间问题都与

中设置的单元格大小有关
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)

或直接在flowLayout.itemSize。

但是......试试:

  1. 选择ViewController:
  2. Selecting View Controller

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

      现在尝试设置自动布局限制。

      祝你好运。

答案 5 :(得分: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

答案 6 :(得分:2)

确保为UICollectionView和UICollectionviewcell设置正确的自动调整遮罩。 这解决了iPhone 4模拟器的问题

答案 7 :(得分:2)

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

enter image description here

答案 8 :(得分:1)

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

希望这有助于某人...

答案 9 :(得分: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);


}

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

这对我来说是因为我试图将我的单元格设置为超级视图的大小而不是UICollectionView的大小。只需使用UICollectionView框架替换超视图框架。

答案 12 :(得分:0)

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

答案 13 :(得分: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。

答案 14 :(得分:-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;
}