UICollectionViewFlowLayout 是系统提供的具体布局对象,是UICollectionViewLayout这个抽象类的子类.
1.UICollectionViewFlowLayout
NS_CLASS_AVAILABLE_IOS(6_0) @interface UICollectionViewFlowLayout : UICollectionViewLayout
@property (nonatomic) CGFloat minimumLineSpacing; // 最小行间距
@property (nonatomic) CGFloat minimumInteritemSpacing; // 最小列间距
@property (nonatomic) CGSize itemSize; // item的尺寸
// 预估高度
@property (nonatomic) CGSize estimatedItemSize NS_AVAILABLE_IOS(8_0); // defaults to CGSizeZero - setting a non-zero size enables cells that self-size via -preferredLayoutAttributesFittingAttributes:
@property (nonatomic) UICollectionViewScrollDirection scrollDirection; // default is UICollectionViewScrollDirectionVertical // 滚动方向
@property (nonatomic) CGSize headerReferenceSize; // 作为头追加视图的尺寸
@property (nonatomic) CGSize footerReferenceSize; // 作为脚追加视图的尺寸
@property (nonatomic) UIEdgeInsets sectionInset; // section 内边距
#TODO:section 内的内容滚动时,header/footer是否驻留
// Set these properties to YES to get headers that pin to the top of the screen and footers that pin to the bottom while scrolling (similar to UITableView).
// header 是否驻留
@property (nonatomic) BOOL sectionHeadersPinToVisibleBounds NS_AVAILABLE_IOS(9_0);
// footer 是否驻留
@property (nonatomic) BOOL sectionFootersPinToVisibleBounds NS_AVAILABLE_IOS(9_0);
@end
2. UICollectionViewDelegateFlowLayout
UICollectionViewFlowLayout的属性都是可以设置每个 item、footer和header的size等功能,但是要是对于想设置特定section或者item等就不行。使用代理,可以具体到每一个item、footer和header等。
@protocol UICollectionViewDelegateFlowLayout <UICollectionViewDelegate>
@optional
// 设置item的size
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;
// 以section为边距, 设置内边距
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section;
// 以section为单位,设置同一行两个item的最小间距
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section;
// 以section为单位,设置同一列两个item的最小间距
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section;
// 设置header的size
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section;
// 设置footer的size
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section;
@end
3.UICollectionViewFlowLayoutInvalidationContext
一组属性,用于确定是否重新计算item的大小或其在布局中的位置。
NS_CLASS_AVAILABLE_IOS(7_0) @interface UICollectionViewFlowLayoutInvalidationContext : UICollectionViewLayoutInvalidationContext
// 指示是否重新计算布局中项目和视图的大小
@property (nonatomic) BOOL invalidateFlowLayoutDelegateMetrics; // if set to NO, flow layout will not requery the collection view delegate for size information etc.
// 指示是否重新计算布局中项目和视图的布局属性。
@property (nonatomic) BOOL invalidateFlowLayoutAttributes; // if set to NO, flow layout will keep all layout information, effectively not invalidating - useful for a subclass which invalidates only a piece of itself
@end
4. UICollectionViewScrollDirection
UICollectionViewFlowLayout 的滚动方向只能是水平和垂直两种。
typedef NS_ENUM(NSInteger, UICollectionViewScrollDirection) {
UICollectionViewScrollDirectionVertical,
UICollectionViewScrollDirectionHorizontal
};
ps :关于同一行的两个item的最小边距和同一列的两个item最小列边距。
因为每行内的item个数是不定的,因为会尽量在一行内排更多数据,当然之间的间距不能小于最小的间距,而FlowLayout 的实现是两端对齐,同时保持一列中的cell间距相等。
如题
可以看到,一列中的cell总是两端和collectionView对齐,cell之间的间隔一致。
网友评论