UICollectionView垂直居中

时间:2014-04-13 09:56:51

标签: ios uicollectionview uicollectionviewlayout

我有一个UICollectionView大小的对象(320,500)。

我需要以内容垂直居中的方式创建UICollectionView。意味着如果内容的总大小是(100,100)那么单元格应该在rect(0,200):( 320,300)中绘制自己。在250以上50和垂直中心50以下。

问题是单元格的数量和单元格的大小仅在运行时决定。例如,如果单元格中的文本可以是1行,则大小为〜(100,50)。如果它是4行大小将〜(100,200)。因此,只有在我为最后一个单元格运行collectionView:sizeForItemAtIndexPath:之后,才能确定第一个单元格的起始位置。

任何开始建议我应该如何解决这个问题。即使我将Flowlayout子类化,在绘制最后一个单元格之前,如何知道第一个单元格的位置?

2 个答案:

答案 0 :(得分:1)

您可以使用insetForSectionAtIndex委托方法来居中单元格:

#pragma mark collection view cell paddings

- (UIEdgeInsets)collectionView:(UICollectionView*)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {

  float leftInset = (self.view.frame.size.width - (COUNT_OF_CELL*WIDTH_OF_CELL + COUNT_OF_CELL-1 * SPACE_BETWEEN_CELLS)) / 2;

  return UIEdgeInsetsMake(0, leftInset, 0, 0); // top, left, bottom, right

}

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {
  return 8;  // this is SPACE_BETWEEN_CELLS
}

您必须更改COUNT_OF_CELL(这是您的数组的计数),WIDTH_OF_CELL,SPACE_BETWEEN_CELLS,它将按您的意愿工作

答案 1 :(得分:1)

我是如何做到的是通过获取集合视图中最后一个元素的布局属性,然后确定视图的contentInsets。它的问题在于插入的变化并不平滑,因为没有动画,但其他方面也有效。

-(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect {

  NSArray* array = [super layoutAttributesForElementsInRect:rect];

    UICollectionViewLayoutAttributes* att = [array lastObject];
    if (att){
        CGFloat lastY = att.frame.origin.y + att.frame.size.height;
        CGFloat diff = self.collectionView.frame.size.height - lastY;

        if (diff > 0){
            UIEdgeInsets contentInsets = UIEdgeInsetsMake(diff/2, 0.0, 0.0, 0.0);
            self.collectionView.contentInset = contentInsets;
        }
    }
    return array;
}