如何水平和垂直居中UICollectionView的单元格?

时间:2013-03-12 07:47:36

标签: uicollectionview uicollectionviewlayout

如何使用UICollectionView垂直和水平居中UICollectionViewFlowLayout中的所有单元格?

流动布局根据滚动方向在右侧或底部留下间距。我想在所有方面设置相同的填充。我玩过sectionInset的{​​{1}}属性。

3 个答案:

答案 0 :(得分:5)

我建议实施UICollectionViewDelegateFlowLayout协议,以动态实现细胞的水平和垂直居中。来自 UICollectionViewDelegateFlowLayout协议参考

  

UICollectionViewDelegateFlowLayout协议定义了一些方法,使您可以与UICollectionViewFlowLayout对象进行协调,以实现基于网格的布局。该协议的方法定义了项目的大小以及网格中项目之间的间距。

     

此协议中的所有方法都是可选的。如果未实现特定方法,则流布局委托将使用其自己的属性中的值来获取相应的间距信息。

     

流布局对象期望集合视图的委托对象采用此协议。因此,在分配给集合视图的委托属性的对象上实现此协议。

您可能最感兴趣的是collectionView:layout:insetForSectionAtIndex:方法,可用于使用UIEdgeInsetsMake等内容调整屏幕四边的插图。您可以根据屏幕大小确定插入,方法是从相应的屏幕尺寸(垂直或水平)中减去适当的数量,如单元格的大小。然后,除以2得到特定维度的相等插入。

答案 1 :(得分:1)

使用了Section Inset?

好的,尝试使用minimumLineSpacing属性和   minimumInteritemSpacing属性

<强> minimumLineSpacing

对于垂直滚动网格,此行间距表示连续行之间的最小间距。对于水平滚动网格,此值表示连续列之间的最小间距。此间距不应用于标题和第一行之间或最后一行和页脚之间的空格。

<强> minimumInteritemSpacing

对于垂直滚动网格,此间距表示同一行中项目之间的最小间距。对于水平滚动网格,此值表示同一列中项目之间的最小间距。此间距用于计算单个行中可以容纳的项目数,但在确定项目数后,实际间距可能会向上调整。

答案 2 :(得分:-1)

子类UICollectionViewFlowLayout并覆盖layoutAttributesForElementsInRect:方法以对齐UICollectionViewCells

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

NSArray* array = [super layoutAttributesForElementsInRect:rect];
CGRect visibleRect;
visibleRect.origin = self.collectionView.contentOffset;
visibleRect.size = self.collectionView.bounds.size;

for(UICollectionViewLayoutAttributes* attributes in array) {

    if(CGRectIntersectsRect(attributes.frame, rect)){

        CGFloat d = UIInterfaceOrientationIsPortrait(_orientation)?
        CGRectGetMidY(visibleRect)-attributes.center.y :
        CGRectGetMidX(visibleRect)-attributes.center.x;

        CGFloat w = visibleRect.size.width;
        CGFloat h = visibleRect.size.height;

        CGFloat dRatio = UIInterfaceOrientationIsPortrait(_orientation)? d/(h/2) : d/(w/2);

        CGFloat angle = MAX_ANGLE*dRatio; // an angle between 0 and MAX_ANGLE based on proximity to center
        CGFloat radians = DEGREES_TO_RADIANS(angle);

        debug = 0;

        CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
        rotationAndPerspectiveTransform.m34 = PERSPECTIVE;

        rotationAndPerspectiveTransform = UIInterfaceOrientationIsPortrait(_orientation)?
        CATransform3DRotate(rotationAndPerspectiveTransform, radians, 1.0f, 0.0f, 0.0f) :
        CATransform3DRotate(rotationAndPerspectiveTransform, radians, 0.0f, 1.0f, 0.0f);

        attributes.transform3D = rotationAndPerspectiveTransform;
    }
}

return array;
}

我没有为您编辑此代码,并且有对宏和实例变量的引用,因此您需要调整它以执行您想要的操作。这用于创建一个Coverflow样式布局,但原则对您来说是相同的,但没有3D业务。您需要设置部分插入以保证流中的单个行或列。