UICollectionView单元格高度/可滚动内容表现异常/不正确

时间:2015-06-08 22:40:05

标签: ios ios8 autolayout uicollectionview uicollectionviewcell

我正在尝试使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优先。结果完全一样。这是我得到的:

enter image description here

上面的GIF没有问题。它真的确实在GIF上完全跳过了一点。

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

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

更新:如果我在UICollectionView Self Sizing Cells with Auto Layout的答案中看到preferredLayoutAttributesFittingAttributes:方法:

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

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

1 个答案:

答案 0 :(得分:2)

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