繁体   English   中英

UICollectionView 布局问题

[英]UICollectionView Layout Issue

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

我已经确定单元格的大小是正确的

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

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

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

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

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

我知道这是一个很晚的回复,但我也经历过这种情况。

在我的视图控制器,让我们把它MyViewController我有一个UICollectionView正在使用自定义的UICollectionViewCell秒。 我正在实现方法collectionView:layout:sizeForItemAtIndexPath ,我返回一个依赖于UICollectionView高度的项目大小。

MyViewController是在故事板中使用自动布局来控制UIViewController的高度的。

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

我通过在viewWillLayoutSubviews方法UICollectionViewLayoutUICollectionView无效来解决了我的问题。

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

早些时候,我曾试图使willAnimateRotationToInterfaceOrientation:duration的布局无效,但没有奏效。 原因可能是所有视图的大小都没有计算出来,所以我们必须等到自动布局完成它的魔力。 我指的是这个 SO 线程

Swift 4.0 更新:

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

在尝试使用全屏单元格创建集合视图时,我自己也遇到过几次这个问题。 我的问题是由于在 IB/Storyboard 中布局 4" 屏幕并为项目大小指定 320*568,但在使用 3.5" 屏幕的模拟器中运行,其高度为 480。解决方案是在代码如下:

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

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

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

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

大多数情况下,问题在于设置的单元格大小

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

或直接在 flowLayout.itemSize 上。

但是...尝试:

  1. 选择视图控制器:

选择视图控制器

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

禁用扩展边选项

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

祝你好运。

这解决了我的问题:

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

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

在此处输入图片说明

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

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

在此处输入图片说明

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

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

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

我有同样的问题

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


}

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

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

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

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

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

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

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

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

在此处输入图片说明 2.故事板“插入自:”从安全区域更改为内容插入

在此处输入图片说明

  1. 将“内容插入”更改为从不在此处输入图片说明

以上修复均不适合我。 我用这个修好了

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM