亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

android中UIColletionView瀑布流布局實現思路以及封裝的實現

2020-07-26 02:57:17
字體:
來源:轉載
供稿:網友

瀑布流實現思路

  • 第一種就是用ScrollView來進行實現,由于它不具備復用的功能,因此我們需要自己寫一套類似復用的模塊來進行優化
  • 第二種就是利用apple做好的復用模塊,自定義UIColletionLayout來實現瀑布流,想想也是第二種實現起來更快更優,OK,封裝一個小小的框架來試試

默認兩列

默認兩列 

三列多倍間距

其他案例

  

上面的動畫切換布局也是自定義UICollectionLayout來進行布局的,簡單的靜態圖片布局展示其實就重寫幾個方法就可以了

1.prepareLayout 每次重新刷新collectionView的時候會調用一次,做一些初始化的工作

2.layoutAttributesForElementsInRect 返回已經制定好之后的每個cell對應的attribute屬性對象進行布局

3.layoutAttributesForItemAtIndexPath 該方法會一直調用,每次cell出來就會根據對應的indexpath來進行方法調用,因此關鍵布局代碼就可以放置在這里進行重新計算

4.collectionViewContentSize 計算整體的大小,實現滾動

上面插入樣式實現的傳送門

瀑布流實現分析

1.基本變量的聲明

// 每一列的間距static const CGFloat MKJDefaultColumnMargin = 10;// 每一行間距static const CGFloat MKJDefaultRowMargin = 10;// 整體的上間距,左間距,下間距,右間距static const UIEdgeInsets MKJDefaultEdgeInsets = {10,10,10,10};// 默認是多少列static const NSUInteger MKJDefaultColumnCounts = 2;@interface MKJWaterFallLayout ()@property (nonatomic,strong) NSMutableArray *attributeArr; // cell屬性的數組@property (nonatomic,strong) NSMutableArray *columnHeightArr; // 每列的高度數組@end

2.初始化

// 每次刷新會調用一次- (void)prepareLayout{  [super prepareLayout];  // 每次重新刷新的時候清除之前的所有高度值,默認就是UIEdg給定的top  [self.columnHeightArr removeAllObjects];  for (NSInteger i = 0; i < [self columnCount]; i++) {    [self.columnHeightArr addObject:@([self insetMargin].top)];  }  // 每次刷新把對應的att屬性清空  [self.attributeArr removeAllObjects];  // 初始化一次每個cell對應的attribute屬性  NSInteger count = [self.collectionView numberOfItemsInSection:0];  for (NSInteger i = 0; i < count; i++) {    NSIndexPath *indexpath = [NSIndexPath indexPathForItem:i inSection:0];    UICollectionViewLayoutAttributes *attribute = [self layoutAttributesForItemAtIndexPath:indexpath];    [self.attributeArr addObject:attribute];  }}

3.關鍵計算代碼

// 返回attribute屬性數組決定最后的排布- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect{  return self.attributeArr;}// 返回對應的indexpath下每個cell的屬性 cell的出現會一直刷新該方法- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath{  // 初始化布局屬性---> 對應的indexpath  UICollectionViewLayoutAttributes *att = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];  CGFloat collectionW = self.collectionView.frame.size.width;  // 寬度是根據列數和間距固定算出來的  CGFloat width = (collectionW - [self insetMargin].left - [self insetMargin].right - ([self columnCount] - 1) * [self columnMargin]) / [self columnCount];  // 高度是根據代理的數據源返回比例計算的  CGFloat height = [self.delegate MKJWaterFallLayout:self heightForItemAtIndexPath:indexPath] * width;  // X 和 Y值都是在找出最小column之后才能確定,核心就是根據列數,找出最小高度的那一列  // 先取出第一個默認是最小的  CGFloat minColumnHeight = [self.columnHeightArr[0] doubleValue];  // 默認最小的是第0列  NSUInteger finalCol = 0;  for (NSInteger i = 1 ; i < [self columnCount]; i++) {    CGFloat currentColHeight = [self.columnHeightArr[i] doubleValue];    if (minColumnHeight > currentColHeight) {      minColumnHeight = currentColHeight;      finalCol = i;    }  }  // x,y值是根據最小高度列算出來的  CGFloat x = [self insetMargin].left + (width + [self columnMargin]) * finalCol;  CGFloat y = minColumnHeight;  // 當你是一個行排布的時候 默認是top值,不需要加間距  NSInteger count = indexPath.item;  if ((count / ([self columnCount])) >= 1) {    y += [self rowMargin];  }  att.frame = CGRectMake(x, y, width, height);  self.columnHeightArr[finalCol] = @(CGRectGetMaxY(att.frame));  return att;}

這里的計算簡概括為就是對每個cell進行frame的計算

1.寬度的計算是根據列間距和整體左右間距以及行數進行限制,這些參數可以是固定值,也可以是代理傳進去的

2.高度的計算必定是根據外部代理進行計算的

3.X值的計算是根據這個框架內部的每一列的高度數組進行之前的緩存高度,進行最小值計算,然后拿出最小值對應的列數,根據上面算出來的高度進行X值的計算

4.Y值的計算和X值一樣,根據給定的數組,比出最小高度列的列數,根據數組的高度,計算出對應的Y值,最終再進行數組對應列數的高度更新

4.獲取實際能容大小,讓其可以滾動

// 計算出滾動區域的大小- (CGSize)collectionViewContentSize{  CGFloat maxColumHeight = [self.columnHeightArr[0] doubleValue];  for (NSInteger i = 1; i < [self columnCount]; i++) {    CGFloat currentColHeight = [self.columnHeightArr[i] doubleValue];    if (maxColumHeight < currentColHeight) {      maxColumHeight = currentColHeight;    }  }  return CGSizeMake(0, maxColumHeight + [self insetMargin].bottom);}

5.這個小框架已經封裝好了,簡單介紹下用法

// 聲明如下- (UICollectionView *)colletionView{  if (_colletionView == nil) {    MKJWaterFallLayout *layout = [[MKJWaterFallLayout alloc] init];    layout.delegate = self;    UICollectionView *collectionV = [[UICollectionView alloc] initWithFrame:[UIScreen mainScreen].bounds collectionViewLayout:layout];    collectionV.backgroundColor = [UIColor redColor];    [collectionV registerNib:[UINib nibWithNibName:productID bundle:nil] forCellWithReuseIdentifier:productID];    collectionV.delegate = self;    collectionV.dataSource = self;    _colletionView = collectionV;  }  return _colletionView;}// 內部行數,間距的控制#pragma mark - waterfallLayoutDelegate- (CGFloat)MKJWaterFallLayout:(MKJWaterFallLayout *)layout heightForItemAtIndexPath:(NSIndexPath *)indexPath{  // 返回寬度和高度比例  MKJProductModel *product = self.dataSource[indexPath.item];  return product.h / product.w;}// 控制列間距- (CGFloat)columnMarginForWaterFallLayout:(MKJWaterFallLayout *)collectionViewLayout{  return 10;}// 控制行間距- (CGFloat)rowMarginForWaterFallLayout:(MKJWaterFallLayout *)collectionViewLayout{  return 30;}// 控制列數- (NSUInteger)columnCountForWaterFallLayout:(MKJWaterFallLayout *)collectionViewLayout{//  if (self.dataSource.count > 50) {//    return 3;//  }  return 3;}// 控制整體上左下右間距- (UIEdgeInsets)insetForWaterFallLayout:(MKJWaterFallLayout *)collectionViewLayout{  return UIEdgeInsetsMake(10, 10, 10, 10);}

Demo地址: http://xiazai.VeVB.COm/201702/yuanma/MKJWaterFallLayout_jb51.rar

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲视频在线观看视频| 日产精品久久久一区二区福利| 久久影院资源网| 日韩精品视频在线观看免费| 日韩精品在线免费播放| 精品亚洲aⅴ在线观看| 久久大大胆人体| www.久久久久久.com| www.欧美免费| 久久久久久久久久久91| 久久精品一本久久99精品| 国产不卡av在线免费观看| 日韩欧美中文字幕在线观看| 国产日产久久高清欧美一区| 色综合色综合久久综合频道88| 亚洲欧美精品中文字幕在线| 欧美黄色片在线观看| 97超级碰碰碰久久久| 国产精品久久久久久久久久三级| 91香蕉电影院| 55夜色66夜色国产精品视频| 成人网中文字幕| 国产午夜一区二区| 91产国在线观看动作片喷水| 亚洲一区二区福利| 亚洲第一天堂无码专区| 欧美成年人视频网站欧美| 亚洲欧洲在线看| 黑人精品xxx一区一二区| 国产一区二区欧美日韩| 搡老女人一区二区三区视频tv| 91av免费观看91av精品在线| 97久久精品人人澡人人爽缅北| 欧美一级大片视频| 亚洲尤物视频网| 国产精品久久久久久久久久ktv| 日韩中文字幕国产精品| 国产精品视频一区国模私拍| 全球成人中文在线| 欧美日韩一二三四五区| 欧美亚洲国产视频| 中文字幕久久精品| 久久6精品影院| 97精品视频在线播放| 精品无人区乱码1区2区3区在线| 欧美激情第1页| 国产精品1区2区在线观看| 久久影视电视剧免费网站| 欧美一级免费看| 亚洲最大av在线| 国产精品极品美女粉嫩高清在线| 久久久久国色av免费观看性色| 久久久久久香蕉网| 欧美有码在线视频| 亚洲视频在线播放| 在线性视频日韩欧美| 久久精品成人动漫| 久久99热精品这里久久精品| 日韩在线视频免费观看| 38少妇精品导航| 欧美日韩人人澡狠狠躁视频| 高清欧美性猛交xxxx黑人猛交| 日韩免费电影在线观看| 97在线视频免费看| 国产成人精品久久二区二区91| 高清欧美性猛交| 国产精品99久久久久久人| 亚洲图片欧美日产| 亚洲第一区中文字幕| 国产精品va在线| 中文字幕日本精品| 亚洲精品资源美女情侣酒店| 成人妇女淫片aaaa视频| 亚洲高清免费观看高清完整版| 中文字幕亚洲欧美日韩在线不卡| 在线亚洲国产精品网| 在线中文字幕日韩| 国产精品丝袜久久久久久高清| 亚洲欧洲高清在线| 亚洲精品v天堂中文字幕| 亚洲欧美综合图区| 亚洲欧美日韩精品久久亚洲区| 亚洲美女免费精品视频在线观看| 亚洲国产女人aaa毛片在线| 欧美精品videossex88| 91av在线免费观看| 欧美在线性视频| 精品久久久久久久久久国产| 亚洲欧洲黄色网| 欧美日韩成人黄色| 久久国产精品久久精品| 超碰日本道色综合久久综合| www高清在线视频日韩欧美| 国产mv免费观看入口亚洲| 亚洲二区中文字幕| 18一19gay欧美视频网站| 久久中文字幕在线视频| 91精品啪在线观看麻豆免费| 成人午夜小视频| 欧美大片在线免费观看| 国产一区二中文字幕在线看| 日韩av在线免费观看| 欧美中文字幕在线| 国产日韩欧美在线| 91国内精品久久| 欧美风情在线观看| 午夜精品久久久久久99热软件| 最近2019免费中文字幕视频三| 欧美日韩国产色| 日韩a**站在线观看| 久久久噜久噜久久综合| 精品视频在线导航| 1769国内精品视频在线播放| 97精品伊人久久久大香线蕉| 精品久久久久久中文字幕一区奶水| 一夜七次郎国产精品亚洲| 成人黄色免费网站在线观看| 日韩在线观看精品| 国内精品久久久久久| 精品久久久久久久中文字幕| 亚洲黄色在线看| 日韩精品在线播放| 日韩中文在线视频| 久久精品国产亚洲精品| 亚洲一级一级97网| 高潮白浆女日韩av免费看| 国内精品一区二区三区| 欧美性xxxxhd| 欧美性猛交xxxx乱大交极品| 久久成人一区二区| 亚洲国产精品va在看黑人| 97avcom| www高清在线视频日韩欧美| 91国产视频在线| 中文字幕亚洲国产| 亚洲一区二区精品| 国内精品久久久久久久久| 中文字幕欧美日韩va免费视频| 中文字幕久热精品视频在线| 97香蕉久久夜色精品国产| 色噜噜久久综合伊人一本| 日韩视频免费在线观看| 亚洲国内高清视频| 日韩精品欧美激情| 美日韩精品视频免费看| 欧美亚洲另类激情另类| 久久黄色av网站| 91热福利电影| 这里只有精品丝袜| 亚洲综合视频1区| 欧美性猛交xxxx乱大交极品| 一区二区三区国产视频| 日韩精品久久久久| 国内精品久久久久| 亚洲在线视频观看| 亚洲人成在线观| 精品视频久久久久久| 国产精品视频免费在线观看| 精品久久在线播放| 综合网日日天干夜夜久久| 国产精品成熟老女人| 色琪琪综合男人的天堂aⅴ视频| 成人免费午夜电影| 欧美亚洲另类视频|