如何使用UICollectionView
垂直和水平居中UICollectionViewFlowLayout
中的所有单元格?
流动布局根据滚动方向在右侧或底部留下间距。我想在所有方面设置相同的填充。我玩过sectionInset
的{{1}}属性。
答案 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业务。您需要设置部分插入以保证流中的单个行或列。