我有一个UICollectionView
大小的对象(320,500)。
我需要以内容垂直居中的方式创建UICollectionView
。意味着如果内容的总大小是(100,100)那么单元格应该在rect(0,200):( 320,300)中绘制自己。在250以上50和垂直中心50以下。
问题是单元格的数量和单元格的大小仅在运行时决定。例如,如果单元格中的文本可以是1行,则大小为〜(100,50)。如果它是4行大小将〜(100,200)。因此,只有在我为最后一个单元格运行collectionView:sizeForItemAtIndexPath:
之后,才能确定第一个单元格的起始位置。
任何开始建议我应该如何解决这个问题。即使我将Flowlayout
子类化,在绘制最后一个单元格之前,如何知道第一个单元格的位置?
答案 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;
}