1. 程式人生 > >iOS開發:瀑布流效果的實現(使用UICollectionView)

iOS開發:瀑布流效果的實現(使用UICollectionView)

iOS開發:瀑布流的實現

圖片描述

效果的實現,主要是對UICollectionViewLayout進行封裝,我的.h檔案中:

#import <UIKit/UIKit.h>
@class CustomeViewLayout;
@protocol CustomViewLayoutDelegate <NSObject>

/**
 計算item高度的代理方法,將item的高度與indexPath傳給外界
 */
- (CGFloat)customFallLayout:(CustomeViewLayout *)customFallLayout itemHeightForWidth:(CGFloat
)itemWidth atIndexPath:(NSIndexPath *)indexPath; @end //實現了瀑布流功能,但是不能新增頭部和底部檢視,如專案中有新增頭部或底部檢視的需求,請慎用!!! @interface CustomeViewLayout : UICollectionViewLayout /** 總列數,預設是2 */ @property (nonatomic, assign) NSInteger columnCount; /** 列間距,預設是0 */ @property (nonatomic, assign) float columnSpacing; /** 行間距,預設是0 */
@property (nonatomic, assign) float rowSpacing; /** section與CollectionView的間距,上、左、下、右,預設是(0, 0, 0, 0) */ @property (nonatomic, assign) UIEdgeInsets sectionInset; /** 同時設定列間距、行間距、sectionInset @param columnSpacing 列間距 @param rowSpacing 行間距 @param sectionInset 設定上、左、下、右的距離 */ - (void)setColumnSpacing:(float
)columnSpacing rowSpacing:(float)rowSpacing sectionInset:(UIEdgeInsets)sectionInset; #pragma mark ====== 代理方法、block二選其一 ====== /** 一下代理屬性與block屬性二選其一,用來設定每一個item的高度 會將item的高度與indexPath傳遞給外界 如果兩個都設定,block的優先順序高,即代理無效 */ /** 代理方法,用來計算item的高度 */ @property (nonatomic, assign) id<CustomViewLayoutDelegate> delegate; /** 計算item高度的block,將item的高度與indexPath傳遞給外界 */ @property (nonatomic, strong) CGFloat(^itemHeightBlock)(CGFloat itemHeight, NSIndexPath *indexPath); #pragma mark ====== 構造方法 ====== + (instancetype)customFallLayoutWithColumnCount:(float)columnCount; - (instancetype)initWithColumCount:(float)columnCount; @end

上面的檔案主要是給外界提供一個介面,可以設定行數、行間距、列間距

實現的檔案中,主要是找到UICollectionView中,最短的列數的最大Y值,把後面需要新增的item新增到這一列的下面,主要程式碼如下:

原文連結