UICollectionView 单元格高度/可滚动内容行为奇怪/不正确

Posted

技术标签:

【中文标题】UICollectionView 单元格高度/可滚动内容行为奇怪/不正确【英文标题】:UICollectionView cell height/scrollable content behaving strange/incorrect 【发布时间】:2015-06-08 22:40:04 【问题描述】:

我正在尝试让 UICollectionView 像 UITableView 一样工作(我想要集合视图的额外灵活性,而不是仅仅使用表格视图,这对于当前和未来可能的一些功能扩展都是如此);具有固定宽度(屏幕宽度)和动态单元格高度(就像 ios 8 的新表格视图功能一样)。我一直在努力让它工作。首先,我通过在我的集合视图子类的布局上设置估计大小来启用自动调整大小:

UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout*)self.collectionViewLayout;
layout.estimatedItemSize = CGSizeMake(SCREEN_WIDTH, 100);

然后我在 Interface Builder 中设置了我的自定义单元格的约束,让它根据我的文本视图的内容增长。

我还以编程方式设置了等于屏幕宽度的宽度约束,否则我的单元格的默认宽度为 50pt。在我的自定义单元格中的awakeFromNib

[self addConstraint: [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:SCREEN_WIDTH]];

它似乎适用于宽度。当我运行我的应用程序时,它会打破高度限制,因为我自己的限制与设置为 100 的 UIView-Encapsulated-Layout-Height 冲突(这实际上意味着自动高度不能很好地工作)。

我降低了垂直约束的优先级,尤其是带有 textview(根据其内容而增长)的优先级,从所需的 (1000) 降低到了一些较低的数字 (900)。我不再打破约束,但那是因为我们不再需要打破约束,因为UIView-Encapsulated-Layout-Height 优先。结果完全一样。这是我得到的:

上面的GIF没有问题。它确实确实在某一点上跳跃,就像在 GIF 上看到的那样。

如何防止这种行为并使我的集合视图单元格的高度动态增长(当然,无需创建虚拟的屏幕外单元格来计算视图大小)?

我不需要支持 iOS 7,因此欢迎使用仅限 iOS 8 及更高版本的解决方案。

更新:如果我实现preferredLayoutAttributesFittingAttributes: 方法,如UICollectionView Self Sizing Cells with Auto Layout 的答案所示:

-(UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes
    UICollectionViewLayoutAttributes *attrs = [layoutAttributes copy];
    CGRect frame = attrs.frame;
    self.frame = frame;

    [self setNeedsLayout];
    [self layoutIfNeeded];

    float desiredHeight = [self.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
    frame.size.height = desiredHeight;
    attrs.frame = frame;
    return attrs;

即使我已经设置,它也总是返回 NIB 的原始视图大小,即在 Interface Builder 中:

self.translatesAutoresizingMaskIntoConstraints = NO;
self.contentView.translatesAutoresizingMaskIntoConstraints = NO;

我不知道为什么它返回一个不正确的值。

【问题讨论】:

也许这个答案会有所帮助,***.com/questions/25895311/… @rdelmar 试过了,什么都做了,还是不行。我确实得到了一些高度,这是不正确的,并且对于所有不应该的单元格都是一样的。所有单元格都带有太多空格。 @rdelmar 它正在从界面生成器返回笔尖大小。 【参考方案1】:

花了几个小时和几天后,我决定回到表格视图。虽然集合视图提供了极大的灵活性并且绝对是未来,但它还没有。

【讨论】:

以上是关于UICollectionView 单元格高度/可滚动内容行为奇怪/不正确的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView:使用 UIStackView 的动态单元格高度

当我使用按钮增加单元格高度时,UICollectionView 单元格相互重叠

UICollectionView 动态单元格高度(Pinterest 布局)

如何在 iOS 中动态更改 UICollectionView 单元格高度

仅通过自动布局确定 UICollectionView 单元格高度

动态 UICollectionView 单元格高度