|
@@ -0,0 +1,326 @@
|
|
|
+//
|
|
|
+// UICollectionViewWaterfallLayout.h
|
|
|
+//
|
|
|
+// Created by Nelson on 12/11/19.
|
|
|
+// Copyright (c) 2012 Nelson Tai. All rights reserved.
|
|
|
+//
|
|
|
+
|
|
|
+#import <UIKit/UIKit.h>
|
|
|
+
|
|
|
+/**
|
|
|
+ * Enumerated structure to define direction in which items can be rendered.
|
|
|
+ */
|
|
|
+typedef NS_ENUM (NSUInteger, CHTCollectionViewWaterfallLayoutItemRenderDirection) {
|
|
|
+ CHTCollectionViewWaterfallLayoutItemRenderDirectionShortestFirst,
|
|
|
+ CHTCollectionViewWaterfallLayoutItemRenderDirectionLeftToRight,
|
|
|
+ CHTCollectionViewWaterfallLayoutItemRenderDirectionRightToLeft
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * Constants that specify the types of supplementary views that can be presented using a waterfall layout.
|
|
|
+ */
|
|
|
+
|
|
|
+/// A supplementary view that identifies the header for a given section.
|
|
|
+extern NSString *const CHTCollectionElementKindSectionHeader;
|
|
|
+/// A supplementary view that identifies the footer for a given section.
|
|
|
+extern NSString *const CHTCollectionElementKindSectionFooter;
|
|
|
+
|
|
|
+#pragma mark - CHTCollectionViewDelegateWaterfallLayout
|
|
|
+
|
|
|
+@class CHTCollectionViewWaterfallLayout;
|
|
|
+
|
|
|
+/**
|
|
|
+ * The CHTCollectionViewDelegateWaterfallLayout protocol defines methods that let you coordinate with a
|
|
|
+ * CHTCollectionViewWaterfallLayout object to implement a waterfall-based layout.
|
|
|
+ * The methods of this protocol define the size of items.
|
|
|
+ *
|
|
|
+ * The waterfall layout object expects the collection view’s delegate object to adopt this protocol.
|
|
|
+ * Therefore, implement this protocol on object assigned to your collection view’s delegate property.
|
|
|
+ */
|
|
|
+@protocol CHTCollectionViewDelegateWaterfallLayout <UICollectionViewDelegate>
|
|
|
+@required
|
|
|
+/**
|
|
|
+ * Asks the delegate for the size of the specified item’s cell.
|
|
|
+ *
|
|
|
+ * @param collectionView
|
|
|
+ * The collection view object displaying the waterfall layout.
|
|
|
+ * @param collectionViewLayout
|
|
|
+ * The layout object requesting the information.
|
|
|
+ * @param indexPath
|
|
|
+ * The index path of the item.
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ * The original size of the specified item. Both width and height must be greater than 0.
|
|
|
+ */
|
|
|
+- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;
|
|
|
+
|
|
|
+@optional
|
|
|
+/**
|
|
|
+ * Asks the delegate for the column count in a section
|
|
|
+ *
|
|
|
+ * @param collectionView
|
|
|
+ * The collection view object displaying the waterfall layout.
|
|
|
+ * @param collectionViewLayout
|
|
|
+ * The layout object requesting the information.
|
|
|
+ * @param section
|
|
|
+ * The section.
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ * The original column count for that section. Must be greater than 0.
|
|
|
+ */
|
|
|
+- (NSInteger)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout columnCountForSection:(NSInteger)section;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Asks the delegate for the height of the header view in the specified section.
|
|
|
+ *
|
|
|
+ * @param collectionView
|
|
|
+ * The collection view object displaying the waterfall layout.
|
|
|
+ * @param collectionViewLayout
|
|
|
+ * The layout object requesting the information.
|
|
|
+ * @param section
|
|
|
+ * The index of the section whose header size is being requested.
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ * The height of the header. If you return 0, no header is added.
|
|
|
+ *
|
|
|
+ * @discussion
|
|
|
+ * If you do not implement this method, the waterfall layout uses the value in its headerHeight property to set the size of the header.
|
|
|
+ *
|
|
|
+ * @see
|
|
|
+ * headerHeight
|
|
|
+ */
|
|
|
+- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout heightForHeaderInSection:(NSInteger)section;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Asks the delegate for the height of the footer view in the specified section.
|
|
|
+ *
|
|
|
+ * @param collectionView
|
|
|
+ * The collection view object displaying the waterfall layout.
|
|
|
+ * @param collectionViewLayout
|
|
|
+ * The layout object requesting the information.
|
|
|
+ * @param section
|
|
|
+ * The index of the section whose header size is being requested.
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ * The height of the footer. If you return 0, no footer is added.
|
|
|
+ *
|
|
|
+ * @discussion
|
|
|
+ * If you do not implement this method, the waterfall layout uses the value in its footerHeight property to set the size of the footer.
|
|
|
+ *
|
|
|
+ * @see
|
|
|
+ * footerHeight
|
|
|
+ */
|
|
|
+- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout heightForFooterInSection:(NSInteger)section;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Asks the delegate for the insets in the specified section.
|
|
|
+ *
|
|
|
+ * @param collectionView
|
|
|
+ * The collection view object displaying the waterfall layout.
|
|
|
+ * @param collectionViewLayout
|
|
|
+ * The layout object requesting the information.
|
|
|
+ * @param section
|
|
|
+ * The index of the section whose insets are being requested.
|
|
|
+ *
|
|
|
+ * @discussion
|
|
|
+ * If you do not implement this method, the waterfall layout uses the value in its sectionInset property.
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ * The insets for the section.
|
|
|
+ */
|
|
|
+- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Asks the delegate for the header insets in the specified section.
|
|
|
+ *
|
|
|
+ * @param collectionView
|
|
|
+ * The collection view object displaying the waterfall layout.
|
|
|
+ * @param collectionViewLayout
|
|
|
+ * The layout object requesting the information.
|
|
|
+ * @param section
|
|
|
+ * The index of the section whose header insets are being requested.
|
|
|
+ *
|
|
|
+ * @discussion
|
|
|
+ * If you do not implement this method, the waterfall layout uses the value in its headerInset property.
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ * The headerInsets for the section.
|
|
|
+ */
|
|
|
+- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForHeaderInSection:(NSInteger)section;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Asks the delegate for the footer insets in the specified section.
|
|
|
+ *
|
|
|
+ * @param collectionView
|
|
|
+ * The collection view object displaying the waterfall layout.
|
|
|
+ * @param collectionViewLayout
|
|
|
+ * The layout object requesting the information.
|
|
|
+ * @param section
|
|
|
+ * The index of the section whose footer insets are being requested.
|
|
|
+ *
|
|
|
+ * @discussion
|
|
|
+ * If you do not implement this method, the waterfall layout uses the value in its footerInset property.
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ * The footerInsets for the section.
|
|
|
+ */
|
|
|
+- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForFooterInSection:(NSInteger)section;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Asks the delegate for the minimum spacing between two items in the same column
|
|
|
+ * in the specified section. If this method is not implemented, the
|
|
|
+ * minimumInteritemSpacing property is used for all sections.
|
|
|
+ *
|
|
|
+ * @param collectionView
|
|
|
+ * The collection view object displaying the waterfall layout.
|
|
|
+ * @param collectionViewLayout
|
|
|
+ * The layout object requesting the information.
|
|
|
+ * @param section
|
|
|
+ * The index of the section whose minimum interitem spacing is being requested.
|
|
|
+ *
|
|
|
+ * @discussion
|
|
|
+ * If you do not implement this method, the waterfall layout uses the value in its minimumInteritemSpacing property to determine the amount of space between items in the same column.
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ * The minimum interitem spacing.
|
|
|
+ */
|
|
|
+- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Asks the delegate for the minimum spacing between colums in a secified section. If this method is not implemented, the
|
|
|
+ * minimumColumnSpacing property is used for all sections.
|
|
|
+ *
|
|
|
+ * @param collectionView
|
|
|
+ * The collection view object displaying the waterfall layout.
|
|
|
+ * @param collectionViewLayout
|
|
|
+ * The layout object requesting the information.
|
|
|
+ * @param section
|
|
|
+ * The index of the section whose minimum interitem spacing is being requested.
|
|
|
+ *
|
|
|
+ * @discussion
|
|
|
+ * If you do not implement this method, the waterfall layout uses the value in its minimumColumnSpacing property to determine the amount of space between columns in each section.
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ * The minimum spacing between each column.
|
|
|
+ */
|
|
|
+- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumColumnSpacingForSectionAtIndex:(NSInteger)section;
|
|
|
+
|
|
|
+@end
|
|
|
+
|
|
|
+#pragma mark - CHTCollectionViewWaterfallLayout
|
|
|
+
|
|
|
+/**
|
|
|
+ * The CHTCollectionViewWaterfallLayout class is a concrete layout object that organizes items into waterfall-based grids
|
|
|
+ * with optional header and footer views for each section.
|
|
|
+ *
|
|
|
+ * A waterfall layout works with the collection view’s delegate object to determine the size of items, headers, and footers
|
|
|
+ * in each section. That delegate object must conform to the `CHTCollectionViewDelegateWaterfallLayout` protocol.
|
|
|
+ *
|
|
|
+ * Each section in a waterfall layout can have its own custom header and footer. To configure the header or footer for a view,
|
|
|
+ * you must configure the height of the header or footer to be non zero. You can do this by implementing the appropriate delegate
|
|
|
+ * methods or by assigning appropriate values to the `headerHeight` and `footerHeight` properties.
|
|
|
+ * If the header or footer height is 0, the corresponding view is not added to the collection view.
|
|
|
+ *
|
|
|
+ * @note CHTCollectionViewWaterfallLayout doesn't support decoration view, and it supports vertical scrolling direction only.
|
|
|
+ */
|
|
|
+@interface CHTCollectionViewWaterfallLayout : UICollectionViewLayout
|
|
|
+
|
|
|
+@property(nonatomic,copy)NSArray*lockingHeadSections;//锁定区头的索引数组NSSting类型
|
|
|
+/**
|
|
|
+ * @brief How many columns for this layout.
|
|
|
+ * @discussion Default: 2
|
|
|
+ */
|
|
|
+@property (nonatomic, assign) NSInteger columnCount;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief The minimum spacing to use between successive columns.
|
|
|
+ * @discussion Default: 10.0
|
|
|
+ */
|
|
|
+@property (nonatomic, assign) CGFloat minimumColumnSpacing;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief The minimum spacing to use between items in the same column.
|
|
|
+ * @discussion Default: 10.0
|
|
|
+ * @note This spacing is not applied to the space between header and columns or between columns and footer.
|
|
|
+ */
|
|
|
+@property (nonatomic, assign) CGFloat minimumInteritemSpacing;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Height for section header
|
|
|
+ * @discussion
|
|
|
+ * If your collectionView's delegate doesn't implement `collectionView:layout:heightForHeaderInSection:`,
|
|
|
+ * then this value will be used.
|
|
|
+ *
|
|
|
+ * Default: 0
|
|
|
+ */
|
|
|
+@property (nonatomic, assign) CGFloat headerHeight;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief Height for section footer
|
|
|
+ * @discussion
|
|
|
+ * If your collectionView's delegate doesn't implement `collectionView:layout:heightForFooterInSection:`,
|
|
|
+ * then this value will be used.
|
|
|
+ *
|
|
|
+ * Default: 0
|
|
|
+ */
|
|
|
+@property (nonatomic, assign) CGFloat footerHeight;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief The margins that are used to lay out the header for each section.
|
|
|
+ * @discussion
|
|
|
+ * These insets are applied to the headers in each section.
|
|
|
+ * They represent the distance between the top of the collection view and the top of the content items
|
|
|
+ * They also indicate the spacing on either side of the header. They do not affect the size of the headers or footers themselves.
|
|
|
+ *
|
|
|
+ * Default: UIEdgeInsetsZero
|
|
|
+ */
|
|
|
+@property (nonatomic, assign) UIEdgeInsets headerInset;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief The margins that are used to lay out the footer for each section.
|
|
|
+ * @discussion
|
|
|
+ * These insets are applied to the footers in each section.
|
|
|
+ * They represent the distance between the top of the collection view and the top of the content items
|
|
|
+ * They also indicate the spacing on either side of the footer. They do not affect the size of the headers or footers themselves.
|
|
|
+ *
|
|
|
+ * Default: UIEdgeInsetsZero
|
|
|
+ */
|
|
|
+@property (nonatomic, assign) UIEdgeInsets footerInset;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief The margins that are used to lay out content in each section.
|
|
|
+ * @discussion
|
|
|
+ * Section insets are margins applied only to the items in the section.
|
|
|
+ * They represent the distance between the header view and the columns and between the columns and the footer view.
|
|
|
+ * They also indicate the spacing on either side of columns. They do not affect the size of the headers or footers themselves.
|
|
|
+ *
|
|
|
+ * Default: UIEdgeInsetsZero
|
|
|
+ */
|
|
|
+@property (nonatomic, assign) UIEdgeInsets sectionInset;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief The direction in which items will be rendered in subsequent rows.
|
|
|
+ * @discussion
|
|
|
+ * The direction in which each item is rendered. This could be left to right (CHTCollectionViewWaterfallLayoutItemRenderDirectionLeftToRight), right to left (CHTCollectionViewWaterfallLayoutItemRenderDirectionRightToLeft), or shortest column fills first (CHTCollectionViewWaterfallLayoutItemRenderDirectionShortestFirst).
|
|
|
+ *
|
|
|
+ * Default: CHTCollectionViewWaterfallLayoutItemRenderDirectionShortestFirst
|
|
|
+ */
|
|
|
+@property (nonatomic, assign) CHTCollectionViewWaterfallLayoutItemRenderDirection itemRenderDirection;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief The minimum height of the collection view's content.
|
|
|
+ * @discussion
|
|
|
+ * The minimum height of the collection view's content. This could be used to allow hidden headers with no content.
|
|
|
+ *
|
|
|
+ * Default: 0.f
|
|
|
+ */
|
|
|
+@property (nonatomic, assign) CGFloat minimumContentHeight;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief The calculated width of an item in the specified section.
|
|
|
+ * @discussion
|
|
|
+ * The width of an item is calculated based on number of columns, the collection view width, and the horizontal insets for that section.
|
|
|
+ */
|
|
|
+- (CGFloat)itemWidthInSectionAtIndex:(NSInteger)section;
|
|
|
+
|
|
|
+@end
|