CollectionView不会停止抱怨不确定的行为

时间:2019-08-16 11:01:30

标签: ios swift uicollectionview

我有一组4个不同的元素,可以在一个小的水平collectionView中显示它们。只有一行,并且collectionView和元素之间的高度总是相同的-但是,它必须是动态的,以防人们增加其文本大小(可访问性较大的文本)。

要执行此操作,我在CollectionView旁边有一个“ spacer”标签,并告诉collectionView与该标签的高度相同,并且在所有单元格中都执行相同的操作。它们都具有相同的字体。

当我尝试运行它时,CollectionView会打印出以下内容:

The behavior of the UICollectionViewFlowLayout is not defined because:
the item height must be less than the height of the UICollectionView 
    minus the section insets top and bottom values, 
    minus the content insets top and bottom values.
Please check the values returned by the delegate.

The relevant UICollectionViewFlowLayout instance is <...>, 
and it is attached to <..; frame = (0 438.5; 414 29.5); 
clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <..>; 
layer = <CALayer:..>; contentOffset: {0, 0}; contentSize: {32, 29.5}; 
adjustedContentInset: {0, 0, 0, 0}> collection view layout: <...>.
Make a symbolic breakpoint at UICollectionViewFlowLayoutBreakForInvalidSizes 
to catch this in the debugger.

但是我能找到的所有东西都返回29.5或更少。

collectionView.contentInsetAdjustmentBehavior = .never
flowLayout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize

ContentInset为.zero,顶部和底部的sectionInset为0,lineSpacing和interItem-spacing为0,scrollDirection = .horizo​​ntal ..

我没有重写任何sizeForItem之类的东西,因为它应该自动发生,并且我不必创建自定义高度逻辑。

我已经在每个单元格中尝试过此操作

override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
    setNeedsLayout()
    layoutIfNeeded()
    layoutAttributes.frame.size = contentView.systemLayoutSizeFitting(UICollectionViewCell.layoutFittingCompressedSize)
    print("Height: ", layoutAttributes.size)
    return layoutAttributes
}

但是它只打印出29.5,应该是正确的。

它确实会在警告后打印出来,因此在此之前发生了一些事情。

当我像这样初始化后立即打印出单元格的高度时:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let item = items[indexPath.row]
    if let someItem = item as? SomeCellViewModel, let cell = self.dequeueReusableCell(withReuseIdentifier: "SomeIdentifier", for: indexPath) as? SomeCell{
        cell.bind(with: someItem)
        print("height: ", cell.bounds.size.height)
        return cell
    }else{ ...

它打印出“ 50.0”。据我了解,这是默认的“项目大小”,但是我已经更改了所有这些内容!在Storyboard / IB / Xib中,“集合视图流布局” 50x50,但我将其更改为其他内容(0x0、1x1、20x20,经过很多测试)。它仍然打印出50.0。单元格的xib甚至在其文件中都不是50。如果我尝试直接在此处使用systemLayoutSize-thing设置其frame.size,它会警告我有关自动调整大小约束,该约束希望为0。我认为无论如何我都不应该在这里进行这样的逻辑,因此我永远不会对此感到介意。 / p>

由于警告说项目“必须<高度>小于小于高度减去X减去Y”(不小于或等于),所以我试图使CollectionView比隔离逻辑高一点,制作了CollectionView 30.5和单元格29.5,但我仍然收到警告。

我尝试设置符号断点,但是那里没有任何价值。

问题是-它的外观和行为正确-在iOS 12上。它在iOS 11上不起作用。在元素中可能存在分离约束问题,这使它在iOS 11上出错了,我正在研究它。无论哪种方式;

我为什么收到此警告?

编辑:如果我实现sizeForItemAt:IndexPath并静态告诉它是 width:100, height: 29.5,完全没有警告。万事皆安。但是我不想那样做。我不需要像这样计算个人身高。而且我也不想处理原型单元。

这应该有效。

0 个答案:

没有答案