layout.h
#import @class waterflowlayout;
@protocol waterflowlayoutdelegate - (cgfloat)waterflowlayout:(waterflowlayout *)waterflowlayout heightforwidth:(cgfloat)width atindexpath:(nsindexpath *)indexpath;
@end
@inte***ce hmwaterflowlayout : uicollectionviewlayout
@property (nonatomic, assign) uiedgeinsets sectioninset;
/** 每一列之間的間距 */
@property (nonatomic, assign) cgfloat columnmargin;
/** 每一行之間的間距 */
@property (nonatomic, assign) cgfloat rowmargin;
/** 顯示多少列 */
@property (nonatomic, assign) int columnscount;
@property (nonatomic, weak) iddelegate;
@end
layout.m
#import "waterflowlayout.h"
//static const cgfloat columnmargin = 10;
//static const cgfloat rowmargin = columnmargin;
@inte***ce waterflowlayout();
/** 這個字典用來儲存每一列最大的y值(每一列的高度) */
@property (nonatomic, strong) nsmutabledictionary *maxydict;
/** 存放所有的布局屬性 */
@property (nonatomic, strong) nsmutablearray *attrsarray;
@end
@implementation hmwaterflowlayout
- (nsmutabledictionary *)maxydict
return _maxydict;
}- (nsmutablearray *)attrsarray
return _attrsarray;
}- (instancetype)init
return self;
}- (bool)shouldinvalidatelayoutforboundschange:(cgrect)newbounds
/** * 每次布局之前的準備
*/- (void)preparelayout
}];return cgsizemake(0, [self.maxydict[maxcolumn] floatvalue] + self.sectioninset.bottom);
}/**
* 返回indexpath這個位置item的布局屬性
*/- (uicollectionviewlayoutattributes *)layoutattributesforitematindexpath:(nsindexpath *)indexpath
}];// 計算尺寸
cgfloat width = (self.collectionview.frame.size.width - self.sectioninset.left - self.sectioninset.right - (self.columnscount - 1) * self.columnmargin)/self.columnscount;
cgfloat height = [self.delegate waterflowlayout:self heightforwidth:width atindexpath:indexpath];
// 計算位置
cgfloat x = self.sectioninset.left + (width + self.columnmargin) * [mincolumn intvalue];
cgfloat y = [self.maxydict[mincolumn] floatvalue] + self.rowmargin;
// 更新這一列的最大y值
self.maxydict[mincolumn] = @(y + height);
// 建立屬性
uicollectionviewlayoutattributes *attrs = [uicollectionviewlayoutattributes layoutattributesforcellwithindexpath:indexpath];
attrs.frame = cgrectmake(x, y, width, height);
return attrs;
}/**
* 返回rect範圍內的布局屬性
*/- (nsarray *)layoutattributesforelementsinrect:(cgrect)rect
@end
整理心態整理人生
上午把自己所有的工資條全部整理到excel裡面,才發現原來自己從來沒有這麼認真地關注過自己每個月發的工資 說來慚愧,也許是最近工資發得太少,所以才這麼關注,或許人只有在遇到窘境的時候,才會看到那些以前不曾關注的事物,窮則思變,其實也並不是完全指經濟上的一時之窮,而是在現實的壓力之下,不得不考慮往後的...
VIM技巧整理(持續整理)
vim用了好幾年了,但在工作中經常用的小技巧卻只有一小部分。前段時間同事教了我乙個給shell指令碼批量加注釋的小技巧,既讓我再次領教了vim功能的強大和便捷,同時也激發了學習vim的熱情。所以我也蒐羅了一些vim技巧的文章,挑選自己不熟又覺得有用的一些,加以歸類整理,以備時常查閱使用。1 cool...
BASE64加密整理整理
beforeencode為encode之前的字串 那麼encode後的字串長度為 1 如果beforeencode.length 是3的整數倍,那麼長度為 beforeencode.length 3 4 2 如果beforeencode.length 不是3的整數倍,那麼長度為 beforeenco...