UICollectionView动态大小单元格只在一个方向上

时间:2015-01-19 16:50:03

标签: ios objective-c autolayout

有没有办法只在一个方向(如高度)动态调整UICollectionViewCell,同时使宽度遵循布局的itemSize尺寸?或者是全部还是全无?

2 个答案:

答案 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,它非常好且非常易于使用(它确实存在一些问题,但与优点相比,它们相当小)。

要使用它,你必须做两件事:

  1. 在单元格中设置自动布局,以便从约束中获取高度和宽度。

  2. 只需将集合视图布局对象的estimatedItemSize属性设置为非零值:

    UICollectionViewFlowLayout *collectionViewLayout = (UICollectionViewFlowLayout *)self.collectionView.collectionViewLayout;
    collectionViewLayout.estimatedItemSize = //your estimated item size
    
  3. 这适用于自行调整大小的单元格(有关更多信息,请观看WWDC 2014视频“表和集合视图中的新功能”)!如果你想要更精细的控制,你可能需要继承UICollectionViewLayout ......