重复利用的瀑布流视图

Step1 ===封装自定义的UIScrollView控制器

1 协议代理方法

1>>数据源代理PollScrollDataSource- (NSInteger)numberOfColums:(UIScrollView *)jrScroll;//返回cell总个数- (NSInteger)numberOfCells:(UIScrollView *)jrScroll;//返回每个cell的实际宽高- (CGSize)sizeOfCellInScroll:(UIScrollView *)jrScroll cellAtIndex:(NSInteger)index;//返回cell视图- (UIView *)jrScroll:(UIScrollView *)jrScroll cellAtIndex:(NSInteger)index;@end2>>属性代理PollScrollDelegate- (CGFloat)rowOfScroll:(UIScrollView *)jrScroll spaceForCellWithFlag:(PollScrollSpace)jrSpace;@end3>>定义代理@property(nonatomic,weak)id <PollScrollDataSource> pollDataSource;@property(nonatomic,weak)id <PollScrollDelegate> pollDelegate;

2 瀑布流视图,计算每个cell的位置大小

1>>由代理方法得到获取的每个cell大小位置{topScrollSpace,//上边距bottomScrollSpace,//下边距leftScrollSpace,//左边距rightScrollSpace,//右边距rowScrollSpace,//行边距columnScrollSpace//列边距 }PollScrollSpace; numberOfCells:self];numberOfColums:self];if (!totalColum) {totalColum=3;}//获取上、下、左、右、行、列间距—如果没有响应实现代理方法,,设置默认值CGFloat topSpace=kSpace,bottomSpace=kSpace,leftSpace=kSpace,rightSpace=kSpace,rowSpace=kSpace,columnSpace=kSpace;if ([self.pollDelegate respondsToSelector:@selector(rowOfScroll:spaceForCellWithFlag:)]) {topSpace=[self.pollDelegate rowOfScroll:self spaceForCellWithFlag:topScrollSpace];bottomSpace=[self.pollDelegate rowOfScroll:self spaceForCellWithFlag:bottomScrollSpace];leftSpace=[self.pollDelegate rowOfScroll:self spaceForCellWithFlag:leftScrollSpace];rightSpace=[self.pollDelegate rowOfScroll:self spaceForCellWithFlag:rightScrollSpace];rowSpace=[self.pollDelegate rowOfScroll:self spaceForCellWithFlag:rowScrollSpace];columnSpace=[self.pollDelegate rowOfScroll:self spaceForCellWithFlag:columnScrollSpace];}CGFloat coorArray[totalColum];for (int i=0; i<totalColum; i++) {//重新把数组初始化一下coorArray[i]=0;}for (int i=0;i<totalCell; i++) {height=coorArray[0];NSInteger index=0;for(int j=0; j<totalColum; j++){if (coorArray[j] < height) {height=coorArray[j];index=j;}}frame=[self.pollDataSource sizeOfCellInScroll:self cellAtIndex:i];=((-leftSpace-rightSpace)-columnSpace*(totalColum-1))/totalColum;*framevSpace=hSpace=frames=CGRectMake(index*hSpace+leftSpace,height+rowSpace,);NSValue * value=[NSValue valueWithCGRect:frames];///更新数组数据coorArray[index]=CGRectGetMaxY(frames);[self.frameArray addObject:value];}//获取最大的heightCGFloat maxHeight=coorArray[0];for (int j=0; j<totalColum; j++) {if (coorArray[j]>maxHeight) {maxHeight=coorArray[j];}}self.contentSize=CGSizeMake(0, maxHeight+10);

3 可以重复利用的瀑布流视图

1>>渲染瀑布流视图方法- (void)layoutSubviews{[super layoutSubviews];; i++) {NSValue * value=self.frameArray[i];CGRect frame=[value CGRectValue];BOOL isInScreen=[self _isInScreen:frame];if(isInScreen){[@(i)]){jrScroll:self cellAtIndex:i];view.frame=frame;[self addSubview:view];//加载到视野屏幕上[self.inScreenDic setObject:view forKey:@(i)];//加入到字典}}else{[@(i)];if(jrCell){//加入到缓存池NSMutableSet * set=self.poolDic[jrCell.identy];[set addObject:jrCell];[jrCell removeFromSuperview];//从屏幕移除[self.inScreenDic removeObjectForKey:@(i)];//从字典删除}}}}2>>判断是不是在屏幕上- (BOOL)_isInScreen:(CGRect)frame{;;return condition;}偶尔,我一个人站在黄昏的荒野,

重复利用的瀑布流视图

相关文章:

你感兴趣的文章:

标签云: