【问题标题】:UICollectionView Layout IssueUICollectionView 布局问题
【发布时间】:2013-04-07 10:49:34
【问题描述】:

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

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

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

【问题讨论】:

  • 请添加一些关于flowLayout.itemSize、collectionView.fram的信息!旋转或 viewDidLoad 时崩溃?
  • 我发现只有当我选择滚动方向为水平时才会出现此错误。
  • 它不会崩溃,只是 UI 变为空白。这是单元格的大小。 300X460 Collection View frame- 300X480 Layout Frame-300X480 我已经从 xib 中获取了所有这些值,我希望 Collection 视图水平滚动而不是垂直滚动。
  • itemSize > CollecitonView.frame(高度或宽度),检查您的 itemSize 和 collecitonView.frame。
  • 是不是因为我将滚动设置为水平?因为它似乎在垂直滚动中工作正常

标签: ios uicollectionview uicollectionviewlayout


【解决方案1】:

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

【讨论】:

  • 我发现取消选中“调整滚动视图插图”删除了警告。 (使用故事板,单元格中的自动布局)
  • 谢谢哥们!你刚刚救了我的命!它对我有用。
  • 为我工作:以编程方式在基于故事板的 uiView 上添加了 collectionView。
【解决方案2】:

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

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

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

【讨论】:

  • 如果你想支持轮换,这比我的回答要好
【解决方案3】:

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

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

MyViewController 在情节提要中使用自动布局来控制UIViewController 的高度。

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

我通过在viewWillLayoutSubviews 方法中使UICollectionViewUICollectionViewLayout 无效解决了我的问题。

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

之前我曾尝试使willAnimateRotationToInterfaceOrientation:duration 中的布局无效,但没有成功。原因可能是所有视图的尺寸还没有计算出来,所以我们必须等到自动布局完成它的魔力。我指的是this SO thread

Swift 4.0 更新:

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

【讨论】:

  • 谢谢!经过数小时尝试不同的建议后,这个简单的解决方案消除了我的布局警告。
  • 这对我在 UIView 内的 collectionView 有效。在这里待了几个小时,这是唯一有效的方法!我只是覆盖了layoutSubviews 方法。
【解决方案4】:

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

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

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

【讨论】:

  • 为什么要将整个视图的大小分配给单个单元格的大小?
  • 我在使用全屏单元格时遇到了这个问题。不确定 OP 是否也在做同样的事情,但这是您遇到此问题的最明显方式。
【解决方案5】:

如果你用的是故事板和自动布局,调试这类问题真的很难……

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

大部分时间问题在于设置的单元格大小

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

或直接在 flowLayout.itemSize 上。

但是……试试:

  1. 选择 ViewController:

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

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

祝你好运。

【讨论】:

    【解决方案6】:

    这解决了我的问题:

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

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

    【讨论】:

      【解决方案7】:

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

      【讨论】:

      • 另外,在单元格的 contentView(或 UITableViewCell 的内容视图)上设置自动调整大小的掩码会有所帮助
      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

        造成这种情况的原因是我试图将单元格设置为超级视图的大小,而不是UICollectionView 的大小。只需将 superview 框架替换为 UICollectionView 框架即可。

        【讨论】:

        • 我使用 CGSize(width: view.frame.width, height:view.frame.height) 作为 collectionview 单元格大小,我改为 CGSize(width: collectionView.frame.width, height: collectionView .frame.height ),那么现在一切正常。 (我在另一个collectionview单元中放置了一个colliomview)
        【解决方案10】:

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

        希望这对某人有所帮助...

        【讨论】:

          【解决方案11】:

          我也有同样的问题

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

          【讨论】:

            【解决方案12】:

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

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

            【讨论】:

              【解决方案13】:

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

              【讨论】:

                【解决方案14】:

                它抱怨项目高度大于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。

                【讨论】:

                  【解决方案15】:

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

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

                  2. 故事板“Inset from:”从 Safe Area 更改为 Content Inset

                  1. 将“内容插入”更改为从不

                  【讨论】:

                    【解决方案16】:

                    以上修复都没有对我有用。 我用这个修复了它

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

                    【讨论】:

                    • 这似乎是不完整的代码。退货声明在哪里?只是 CGSize(width, collectionView.frame.size.height) 还是你改了?
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-09-03
                    • 1970-01-01
                    • 2021-08-03
                    • 2020-09-10
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多