默认的流式布局会自动换行,以便使区段中的条目能够使用集合视图的长度或宽度,但这样做出来的视图只能在一个方向上滚动。如果愿意多做一些数学运算,就可以编写自定义的布局子类,从而实现不会换行的双向滚动视图。实现该功能所需要的运算律比较大,而且不是特别容易。
完全定制了UICollectionViewFlowLayout的子类,覆写了collectionViewContentSize及layoutAttributesForItemAtIndexPath:方法,以便手工摆放每个条目。这种实现方式完全考虑到所有与间隔有关的请求以及回调方法。相比之下,普通的流式布局只会在满足多个最小值的前提下,试着把条目合适摆放到屏幕上。
typedef NS_ENUM(NSUInteger, GridRowAlignment) {
GridRowAlignmentNone,
GridRowAlignmentTop,
GridRowAlignmentCenter,
GridRowAlignmentBottom,
};
@interface GridLayout : UICollectionViewFlowLayout
@property (nonatomic,assign) GridRowAlignment aligment;
@end
@implementation GridLayout
- (BOOL)usesIndividualItemSizing
{
return [self.collectionView.delegate respondsToSelector:@selector(collectionView:layout:sizeForItemAtIndexPath:)];
}
- (CGSize)sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
CGSize itemSize = self.itemSize;
if ([self usesIndividualItemSizing]) {
itemSize = [(id <UICollectionViewDelegateFlowLayout>)self.collectionView.delegate collectionView:self.collectionView layout:self sizeForItemAtIndexPath:indexPath];
}
return itemSize;
}
- (BOOL)usesIndividualInsets
{
return [self.collectionView.delegate respondsToSelector:@selector(collectionView:layout:insetForSectionAtIndex:)];
}
- (UIEdgeInsets)insetsForSection:(NSInteger)section
{
UIEdgeInsets insets