有没有办法只在一个方向(如高度)动态调整UICollectionViewCell
,同时使宽度遵循布局的itemSize尺寸?或者是全部还是全无?
答案 0 :(得分:2)
您可以从NIB创建用于调整大小的单元格,例如:
_sizingCell = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([MyCell class]) owner:self options:nil] firstObject];
让我们假设MyCell有一个titleLabel用于exmpl。然后你可以让autolayout在collectionView中计算你的大小:layout:sizeForItemAtIndexPath:
NSString *title = self.items[indexPath.item];
self.sizingCell.titleLabel.text = item.title;
CGSize size = [self.sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
return CGSizeMake(size.width, 33);
此操作可能需要一些时间,因此我建议缓存计算值。让我们创建属性NSCache *cellWidthCache
NSString *title = self.items[indexPath.item];
self.sizingCell.titleLabel.text = item.title;
NSNumber *cachedWidth = [self.cellWidthCache objectForKey:indexPath];
if (!cachedWidth) {
cachedWidth = @([self.sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].width);
[self.cellWidthCache setObject:cachedWidth forKey:indexPath];
}
return CGSizeMake(cachedWidth.floatValue, 33);
答案 1 :(得分:1)
从iOS 8开始,它们是由Apple提供的称为Self-Sizing Cells的api,它非常好且非常易于使用(它确实存在一些问题,但与优点相比,它们相当小)。
要使用它,你必须做两件事:
在单元格中设置自动布局,以便从约束中获取高度和宽度。
只需将集合视图布局对象的estimatedItemSize属性设置为非零值:
UICollectionViewFlowLayout *collectionViewLayout = (UICollectionViewFlowLayout *)self.collectionView.collectionViewLayout;
collectionViewLayout.estimatedItemSize = //your estimated item size
这适用于自行调整大小的单元格(有关更多信息,请观看WWDC 2014视频“表和集合视图中的新功能”)!如果你想要更精细的控制,你可能需要继承UICollectionViewLayout ......