iOS開發:瀑布流效果的實現(使用UICollectionView)
阿新 • • 發佈:2019-01-10
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新增到這一列的下面,主要程式碼如下: