UICollectionView 单元格 height/scrollable 内容表现 strange/incorrect
UICollectionView cell height/scrollable content behaving strange/incorrect
我正在尝试让 UICollectionView 像 UITableView 一样工作(我想要集合视图的额外灵活性,而不是仅仅使用 table 视图,对于一些当前和未来可能的功能扩展);具有固定宽度(屏幕宽度)和动态单元格高度(就像 iOS 8 的新 table 视图功能一样)。我一直在努力让它工作。首先,我通过在我的集合视图子类上设置布局的估计大小来启用自动调整大小:
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;
}
然后它总是返回 Interface Builder 中的 NIB 原始视图大小,即使我已经设置:
self.translatesAutoresizingMaskIntoConstraints = NO;
self.contentView.translatesAutoresizingMaskIntoConstraints = NO;
我不知道为什么它会返回不正确的值。
在花费数小时和数天之后,我决定返回 table 视图。虽然集合视图提供了极大的灵活性并且绝对是未来,但它还没有出现。
我正在尝试让 UICollectionView 像 UITableView 一样工作(我想要集合视图的额外灵活性,而不是仅仅使用 table 视图,对于一些当前和未来可能的功能扩展);具有固定宽度(屏幕宽度)和动态单元格高度(就像 iOS 8 的新 table 视图功能一样)。我一直在努力让它工作。首先,我通过在我的集合视图子类上设置布局的估计大小来启用自动调整大小:
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;
}
然后它总是返回 Interface Builder 中的 NIB 原始视图大小,即使我已经设置:
self.translatesAutoresizingMaskIntoConstraints = NO;
self.contentView.translatesAutoresizingMaskIntoConstraints = NO;
我不知道为什么它会返回不正确的值。
在花费数小时和数天之后,我决定返回 table 视图。虽然集合视图提供了极大的灵活性并且绝对是未来,但它还没有出现。