首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流

iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流

作者头像
lizelu
发布于 2018-01-11 08:15:20
发布于 2018-01-11 08:15:20
1.5K00
代码可运行
举报
文章被收录于专栏:青玉伏案青玉伏案
运行总次数:0
代码可运行

上篇博客的实例是自带的UICollectionViewDelegateFlowLayout布局基础上来做的Demo, 详情请看《iOS开发之窥探UICollectionViewController(二) --详解CollectionView各种回调》。UICollectionView之所以强大,是因为其具有自定义功能,这一自定义就不得了啦,自由度非常大,定制的高,所以功能也是灰常强大的。本篇博客就不使用自带的流式布局了,我们要自定义一个瀑布流。自定义的瀑布流可以配置其参数: 每个Cell的边距,共有多少列,Cell的最大以及最小高度是多少等。

一.先入为主

先来看一下不同配置参数下运行后的效果吧,每张截图的列数和Cell之间的边距都有所不同,瀑布流的列数依次为2,3,8。有密集恐惧证的童鞋就不要看这些运行效果图了,真的会看晕的。下面这些运行效果就是修改不同的配置参数来进行布局的。看图吧,关于瀑布流的效果就不啰嗦了。以下的效果就是使用自定义布局做的,接下来将会介绍一下其实现原理。

二. UICollectionViewLayout

在介绍上述效果实现原理之前,需要介绍一下UICollectionViewLayout。UICollectionView的自定义功能就是自己去实现UICollectionViewLayout的子类,然后重写相应的方法来实现Cell的布局,先介绍一下需要重写的方法,然后再此方法上进行应用实现上述瀑布流。好,废话少说,干活走起。

1.布局预加载函数

当布局首次被加载时会调用prepareLayout函数,见名知意,就是预先加载布局,在该方法中可以去初始化布局相关的数据。该方法类似于视图控制器的ViewDidLoad方法,稍后回用到该方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 // The collection view calls -prepareLayout once at its first layout as the first message to the layout instance.
2 // The collection view calls -prepareLayout again after layout is invalidated and before requerying the layout information.
3 // Subclasses should always call super if they override.
4 - (void)prepareLayout;

2.内容滚动范围

下方是定义ContentSize的方法。该方法会返回CollectionView的大小,这个方法也是自定义布局中必须实现的方法。说白了,就是设置ScrollView的ContentSize,即滚动区域。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 // Subclasses must override this method and use it to return the width and height of the collection view’s content. These values represent the width and height of all the content, not just the content that is currently visible. The collection view uses this information to configure its own content size to facilitate scrolling.
2 - (CGSize)collectionViewContentSize; 

3.确定布局属性

下方四个方法是确定布局属性的,下方第一个方法返回一个数组,该数组中存放的是为每个Cell绑定的UICollectionViewLayoutAttributes属性,便于在下面第二个方法中去定制每个Cell的属性。第三个方法就是根据indexPath来获取Cell所绑定的layoutAtrributes, 然后去更改UICollectionViewLayoutAttributes对象的一些属性并返回,第四个是为Header View或者FooterView来定制其对应的UICollectionViewLayoutAttributes,然后返回。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 // UICollectionView calls these four methods to determine the layout information.
2 // Implement -layoutAttributesForElementsInRect: to return layout attributes for for supplementary or decoration views, or to perform layout in an as-needed-on-screen fashion.
3 // Additionally, all layout subclasses should implement -layoutAttributesForItemAtIndexPath: to return layout attributes instances on demand for specific index paths.
4 // If the layout supports any supplementary or decoration view types, it should also implement the respective atIndexPath: methods for those types.
5 - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect; // return an array layout attributes instances for all the views in the given rect
6 - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath;
7 - (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath;
8 - (UICollectionViewLayoutAttributes *)layoutAttributesForDecorationViewOfKind:(NSString*)elementKind atIndexPath:(NSIndexPath *)indexPath;

4.UICollectionViewLayoutAttributes

下方是UICollectionViewLayoutAttributes常用的属性,你可以在上面第二个方法中去为下方这些属性赋值,为Cell定制属于自己的Attributes。由下方的属性就对自定义布局的的强大,在本篇博客中只用到了下方的一个属性,那就是frame。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 @property (nonatomic) CGRect frame;
2 @property (nonatomic) CGPoint center;
3 @property (nonatomic) CGSize size;
4 @property (nonatomic) CATransform3D transform3D;
5 @property (nonatomic) CGRect bounds NS_AVAILABLE_IOS(7_0);
6 @property (nonatomic) CGAffineTransform transform NS_AVAILABLE_IOS(7_0);
7 @property (nonatomic) CGFloat alpha;
8 @property (nonatomic) NSInteger zIndex; // default is 0
9 @property (nonatomic, getter=isHidden) BOOL hidden; // As an optimization, UICollectionView might not create a view for items whose hidden attribute is YES

三. UICollectionViewLayout的应用

经过上面的简单介绍,想必对UICollectionViewLayout有一定的了解吧,UICollectionViewLayout中还有好多方法,以后用到的时候在给大家介绍。接下来要使用自定义布局来实现瀑布流。我们需要在UICollectionViewLayout的子类中实现相应的布局方法,因为UICollectionViewLayout是虚基类,是不能直接被实例化的,所以我们需要新建一个布局类,这个布局类继承自UICollectionViewLayout。然后去实现上述方法,给每个Cell定制不同的UICollectionViewLayoutAttributes。好了还是拿代码说话吧。

1.重写prepareLayout方法去初始化一些数据,该方法在CollectionView重新加载时只会调用一次,所以把一些参数的配置,计算每个Cell的宽度,每个Cell的高度等代码放在预处理函数中。在该函数中具体调用的函数如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 #pragma mark -- <UICollectionViewLayout>虚基类中重写的方法
 2 
 3 /**
 4  * 该方法是预加载layout, 只会被执行一次
 5  */
 6 - (void)prepareLayout{
 7     [super prepareLayout];
 8     
 9     [self initData];
10     
11     [self initCellWidth];
12     
13     [self initCellHeight];
14     
15 }

2.返回内容的范围,即为CollectionView设定ContentSize。ContentSize的Width就是屏幕的宽度,而ContentSize的高度是一列中最后一个Cell的Y坐标加上其自身高度的最大值。在此函数中会调用求CellY数组中的最大值。具体实现代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 /**
2  * 该方法返回CollectionView的ContentSize的大小
3  */
4 - (CGSize)collectionViewContentSize{
5     
6     CGFloat height = [self maxCellYArrayWithArray:_cellYArray];
7     
8     return CGSizeMake(SCREEN_WIDTH,  height);
9 }

3.下面的方法是为每个Cell去绑定一个UICollectionViewLayoutAttributes对象,并且以数组的形式返回,在我们的自定义瀑布流中,我们只自定义了Cell的frame,就可以实现我们的瀑布流,UICollectionViewLayoutAttributes的其他属性我们没有用到,由此可以看出自定义Cell布局功能的强大。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 /**
 2  * 该方法为每个Cell绑定一个Layout属性~
 3  */
 4 - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
 5 {
 6     
 7     [self initCellYArray];
 8     
 9     NSMutableArray *array = [NSMutableArray array];
10     
11     //add cells
12     for (int i=0; i < _numberOfCellsInSections; i++)
13     {
14         NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:0];
15         
16         UICollectionViewLayoutAttributes *attributes = [self layoutAttributesForItemAtIndexPath:indexPath];
17         
18         [array addObject:attributes];
19     }
20     
21     return array;
22     
23 }

4. 通过下述方法设定每个Cell的UICollectionViewLayoutAttributes对象的参数,为了实现瀑布流所以我们只需要设置每个Cell的frame即可。每个cell的frame的确定是以列来定的,有所在列的上个Cell的Y坐标来确定下个cell的位置。瀑布流实现关键点如下:

   (1)Cell宽度计算:如果瀑布流的列数和Cell的Padding确定了,那么每个Cell的宽度再通过屏幕的宽度就可以计算出来了。

   (2)Cell高度计算:通过随机数生成的高度

   (3)Cell的X轴坐标计算:通过列数,和Padding,以及每个Cell的宽度很容易就可以计算出每个Cell的X坐标。

   (4)Cell的Y轴坐标计算:通过Cell所在列的上一个Cell的Y轴坐标,Padding, 和 上一个Cell的高度就可以计算下一个Cell的Y坐标,并记录在Y坐标的数组中了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 该方法为每个Cell绑定一个Layout属性~
 */
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath{
    
    UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
    
    CGRect frame = CGRectZero;
    
    CGFloat cellHeight = [_cellHeightArray[indexPath.row] floatValue];
    
    NSInteger minYIndex = [self minCellYArrayWithArray:_cellYArray];
    
    CGFloat tempX = [_cellXArray[minYIndex] floatValue];
    
    CGFloat tempY = [_cellYArray[minYIndex] floatValue];
    
    frame = CGRectMake(tempX, tempY, _cellWidth, cellHeight);
    
    //更新相应的Y坐标
    _cellYArray[minYIndex] = @(tempY + cellHeight + _padding);
    
    //计算每个Cell的位置
    attributes.frame = frame;
    
    return attributes;
}

5. initData方法主要是对数据进行初始化,在本篇博客中为了先实现效果,我们暂且把数据给写死。下篇博客会在本篇博客中的基础上进行优化和改进,这些配置参数都会在Delegate中提供,便于灵活的去定制属于你自己的瀑布流。本篇博客中Demo的配置项先写死就OK了,还是那句话,下篇博客中会给出一些相应的代理,来定制我们的瀑布流。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 初始化相关数据
 */
- (void) initData{
    _numberOfSections = [self.collectionView numberOfSections];
    _numberOfCellsInSections = [self.collectionView numberOfItemsInSection:0];
    
    //通过回调获取列数
    _columnCount = 5;
    _padding = 5;
    _cellMinHeight = 50;
    _cellMaxHeight = 150;
}

6.下方的方法是根据Cell的列数来求出Cell的宽度。因为Cell的宽度都是一样的,每个Cell的间隔也是一定的。例如有5列Cell, 那么Cell中间的间隔就有4(5-1)个,那么每个Cell的宽度就是屏幕的宽度减去所有间隔的宽度,再除以列数就是Cell的宽度。如果没听我啰嗦明白的话,直接看代码吧,并不复杂。每个Cell的宽度和间隔确定了,那么每个Cell的X轴坐标也就确定了。代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 /**
 2  * 根据Cell的列数求出Cell的宽度
 3  */
 4 - (void) initCellWidth{
 5     //计算每个Cell的宽度
 6     _cellWidth = (SCREEN_WIDTH - (_columnCount -1) * _padding) / _columnCount;
 7     
 8     //为每个Cell计算X坐标
 9     _cellXArray = [[NSMutableArray alloc] initWithCapacity:_columnCount];
10     for (int i = 0; i < _columnCount; i ++) {
11         
12         CGFloat tempX = i * (_cellWidth + _padding);
13         
14         [_cellXArray addObject:@(tempX)];
15     }
16 
17 }

6. 根据Cell的最小高度和最大高度来利用随机数计算每个Cell的高度,把每个Cell的高度记录在数组中,便于Cell加载时使用。具体代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 /**
 2  * 随机生成Cell的高度
 3  */
 4 - (void) initCellHeight{
 5     //随机生成Cell的高度
 6     _cellHeightArray = [[NSMutableArray alloc] initWithCapacity:_numberOfCellsInSections];
 7     for (int i = 0; i < _numberOfCellsInSections; i ++) {
 8         
 9         CGFloat cellHeight = arc4random() % (_cellMaxHeight - _cellMinHeight) + _cellMinHeight;
10         
11         [_cellHeightArray addObject:@(cellHeight)];
12     }
13 
14 }

7.初始化Cell的Y轴坐标数组,因为是瀑布流,瀑布流的特点是每列中Cell的X轴坐标是相同的,我们只需要根据本列上一个Cell的Y轴坐标来确定本列中将要插入Cell的Y轴坐标,所有我们需要维护一个每列当前Cell的Y轴坐标数组。其初始化方法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 初始化每列Cell的Y轴坐标
 */
- (void) initCellYArray{
    _cellYArray = [[NSMutableArray alloc] initWithCapacity:_columnCount];
    
    for (int i = 0; i < _columnCount; i ++) {
        [_cellYArray addObject:@(0)];
    }
}

8.下面的方法是求Cell的Y轴坐标数组的最大值,因为在Cell都加载完毕后,Cell数组中最大值就是CollectionView的ContentSize的Height的值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 /**
 2  * 求CellY数组中的最大值并返回
 3  */
 4 - (CGFloat) maxCellYArrayWithArray: (NSMutableArray *) array{
 5     if (array.count == 0) {
 6         return 0.0f;
 7     }
 8     
 9     CGFloat max = [array[0] floatValue];
10     for (NSNumber *number in array) {
11         
12         CGFloat temp = [number floatValue];
13         
14         if (max < temp) {
15             max = temp;
16         }
17     }
18     
19     return max;
20 }

9.下方代码是求CellY数组中的第一个最小值的索引,因为求出这个CellY数组中的第一个Cell最新值得索引就是Cell应该插入的列。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 /**
 2  * 求CellY数组中的最小值的索引
 3  */
 4 - (CGFloat) minCellYArrayWithArray: (NSMutableArray *) array{
 5     
 6     if (array.count == 0) {
 7         return 0.0f;
 8     }
 9     
10     NSInteger minIndex = 0;
11     CGFloat min = [array[0] floatValue];
12     
13     for (int i = 0; i < array.count; i ++) {
14         CGFloat temp = [array[i] floatValue];
15         
16         if (min > temp) {
17             min = temp;
18             minIndex = i;
19         }
20     }
21     
22     return minIndex;
23 }

自定义集合视图控制器布局第一阶段就先到这,下篇博客会在此基础上进一步开发。把上述写死的配置参数,通过Delegate提供,使其在UICollectionView可进行配置,其配置方式类似于UICollectionViewDelegateFlowLayout的代理方法。

上述代码gitHub分享地址:https://github.com/lizelu/CustomCollectionViewLayout

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-10-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Objectiv-c - UICollectionViewLayout自定义布局-瀑布流Demo地址
公开变量以及代理. 公开的变量是可以进行调用时设置,一般就为这些,delegate用来实现动态的高度设置
gwk_iOS
2018/08/23
6120
Objectiv-c - UICollectionViewLayout自定义布局-瀑布流Demo地址
iOS流布局UICollectionView系列四——自定义FlowLayout进行瀑布流布局
        前几篇博客从UICollectionView的基础应用到设置UICollectionViewFlowLayout更加灵活的进行布局,但都限制在系统为我们准备好的布局框架中,还是有一些局限性,例如,如果我要进行瀑布流似的不定高布局,前面的方法就很难满足我们的需求了,如下:
珲少
2018/08/15
3.4K0
iOS流布局UICollectionView系列四——自定义FlowLayout进行瀑布流布局
iOS 瀑布流实现「建议收藏」
我们将collectionview定义为一个属性变量,并在viewDidLoad中对其进行设置:首先我们创建了一个布局对象(layout),类型是我们自己定义的布局类(WaterfallFlowLayout),接着我们又对属性变量collectionview进行了创建,设置了他的frame。然后就是对其代理的设置,collectionview的代理有三个,除了和tableview相同的代理和数据源之外,还有一个布局的代理(UICollectionViewDelegateFlowLayout),这里只设置了两个代理,就是数据源和处理事件的代理。这里需要注意的是tableview的重用机制不需要注册,但是collectionview必须要注册,注册的类是自己定义的cell的类(WaterFallCollectionViewCell),然后再跟上标识。值得一提的是collectionview只能采用重用的方式来加载cell。
全栈程序员站长
2022/11/17
2.8K1
iOS 瀑布流实现「建议收藏」
UICollectionView 很简单的写个瀑布流
你项目中要用到它吗? 可能会在你的项目中用到这玩意,最近也是要用就简单的写了一个 Demo。没多少代码,就不放Git了,下面会详细点的说说代码的,要还有什么问题的小伙伴可以直接Q我,也可以把Demo发给你,这里有Q可以找一下加我 多多交流,互相学习!    下面是简单的一个效果图,先给看看效果图! 739006-20160607165303027-1215360678.png 先说说控制器里面的代码,控制器里面就是我们的  UICollectionView  的一些基本的创建了。其实它和 UITabl
Mr.RisingSun
2018/01/09
1.2K0
UICollectionView 很简单的写个瀑布流
iOS开发之窥探UICollectionViewController(五) --一款炫酷的图片浏览组件
本篇博客应该算的上CollectionView的高级应用了,从iOS开发之窥探UICollectionViewController(一)到今天的(五),可谓是由浅入深的窥探了一下UICollectionView的用法,这些用法不仅包括SDK中自带的流式布局(UICollectionViewDelegateFlowLayout)而且介绍了如何根据你的需求去自定义属于你自己的CollectionView。自定义的CollectionView可谓是非常灵活,其灵活性也决定了其功能的强大。CollectionVie
lizelu
2018/01/11
1.7K0
iOS开发之窥探UICollectionViewController(五) --一款炫酷的图片浏览组件
iOS流布局UICollectionView系列五——圆环布局的实现
        前边的几篇博客,我们了解了UICollectionView的基本用法以及一些扩展,在不定高的瀑布流布局中,我们发现,可以通过设置具体的布局属性类UICollectionViewLayoutAttributes来设置设置每个item的具体位置,我们可以再扩展一下,如果位置我们可以自由控制,那个布局我们也可以更加灵活,就比如创建一个如下的circleLayout:
珲少
2018/08/16
1.7K0
iOS流布局UICollectionView系列五——圆环布局的实现
iOS_WaterfallFlowLayout瀑布流用重写UICollectionViewFlowLayout类实现
最近调研瀑布流,在gitHub上下了个Demo发现它的所有视图都是用Main.storyboard拖的, 自己研究半天没研究明白;
mikimo
2022/07/20
4890
iOS---UICollectionView自定义流布局实现瀑布流效果
自定义布局,实现瀑布流效果 自定义流水布局,继承UICollectionViewLayout 实现一下方法 // 每次布局之前的准备 - (void)prepareLayout; // 返回所有的尺寸 - (CGSize)collectionViewContentSize; // 返回indexPath这个位置Item的布局属性 - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)
用户1941540
2018/05/11
2.3K0
iOS瀑布流
瀑布流Demo 瀑布流截图.gif 使用UICollectionView实现瀑布流 自定义UICollectionViewLayout中的主要代码: YJWaterFlowLayout.h中代码: #
hrscy
2018/08/30
1.7K0
iOS瀑布流
【iOS】瀑布流的实现
Simulator Screen Shot - iPhone 8 - 2020-01-16 at 17.32.16.png
MapleYe
2020/03/28
2.3K0
iOS 瀑布流之栅格布局
实现的栅格布局效果示意图 需求示意图 确定需求 由上面的需求示意图可知模块的最小单位是正方形,边长是屏幕宽除去边距间隔后的四等份,而每个模块的样式有小正方形(1:1)、大正方形(2:2)、横长方形(2:1)、纵长方形(1:2),动态的根据服务器下发模块样式绘制布局,可以横向滑动,限定为两行的高度。 注意:上面的示意宽高比是约等于,忽略了间距,计算的时候千万别忘了。 实现思路 由上需求分析可知,我们可以让后台每个模块下发width和height两个字段,字段的值是1或2就行了,然后我们就能根据宽高字
且行且珍惜_iOS
2018/08/13
1.9K0
iOS 瀑布流之栅格布局
iOS流布局UICollectionView系列七——三维中的球型布局
        通过6篇的博客,从平面上最简单的规则摆放的布局,到不规则的瀑布流布局,再到平面中的圆环布局,我们突破了线性布局的局限,在后面,我们将布局扩展到了空间,在Z轴上进行了平移,我们实现了一个类似UIPickerView的布局模型,其实我们还可以再进一步,类比于平面布局,picKerView只是线性排列布局在空间上的旋转与平移,这次,我们更加充分了利用一下空间的尺寸,来设计一个圆球的布局模型。以下是前几篇博客地址:
珲少
2018/08/16
1.6K0
iOS流布局UICollectionView系列七——三维中的球型布局
iOS流布局UICollectionView系列六——将布局从平面应用到空间
        前面,我们将布局由线性的瀑布流布局扩展到了圆环布局,这使我们使用UICollectionView的布局思路大大迈进了一步,这次,我们玩的更加炫一些,想办法将布局应用的空间,你是否还记得,在管理布局的item的具体属性的类UICollectionViewLayoutAttributrs类中,有transform3D这个属性,通过这个属性的设置,我们真的可以在空间的坐标系中进行布局设计。iOS系统的控件中,也并非没有这样的先例,UIPickerView就是很好的一个实例,这篇博客,我们就通过使用UICollectionView实现一个类似系统的UIPickerView的布局视图,来体会UICollectionView在3D控件布局的魅力。系统的pickerView效果如下:
珲少
2018/08/15
1.7K0
iOS流布局UICollectionView系列六——将布局从平面应用到空间
iOS开发之窥探UICollectionViewController(四) --一款功能强大的自定义瀑布流
在上一篇博客中《iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流》,自定义瀑布流的列数,Cell的外边距,Cell的最大以及最小高度是在我们的布局文件中是写死的,换句话说也就是不可配置的。为了循序渐进,由浅入深呢,上篇博客暂且那么写。不过那样写太过死板,本来使用起来比较灵活的自定义布局,如果把其配置参数给写死了,就相当于在笼中的猛兽,再厉害不也白扯蛮。 在今天这篇博客中我们要接着上篇博客中的Demo,使其自定义布局的属性在使用它
lizelu
2018/01/11
7530
iOS开发之窥探UICollectionViewController(四) --一款功能强大的自定义瀑布流
iOS开发之UICollectionViewDataSourcePrefetching
在iOS10中,苹果为UICollectionViewCell引入了Pre-Fetching预加载机制用于提升它的性能。主要引入了一个新的数据源协议UICollectionViewDataSourcePrefetching,包含两个方法: @protocol UICollectionViewDataSourcePrefetching <NSObject> @required // 预加载数据 - (void)collectionView:(UICollectionView *)collectionView
YungFan
2018/05/03
2.4K0
iOS开发之UICollectionViewDataSourcePrefetching
Swift:瀑布流 网络加载图片 Swift5
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
菜菜不吃蔡
2019/10/30
1.8K0
iOS 瀑布流封装
初始化仅三行代码,只需设置代理和样式,item的大小、头脚视图的大小、行列数以及间距都可以在对应样式的代理方法中自定义,然后设置为UICollectionView的自动流水布局样式,并结合UICollectionView的用法使用,详情看示例
且行且珍惜_iOS
2018/05/21
1.9K0
iOS第三方左对齐布局类——UICollectionViewLeftAlignedLayout
        UICollectionViewLeftAlignedLayout是第三方的左对齐布局管理类,其继承自UICollectionViewFlowLayout,使用其可以方便的进行左对齐的瀑布流界面布局。
珲少
2018/08/15
2.2K0
iOS第三方左对齐布局类——UICollectionViewLeftAlignedLayout
UI篇-UICollectionView 补充
http://blog.csdn.net/xiyouios/article/details/50191101
進无尽
2018/09/12
1.8K0
UI篇-UICollectionView 补充
iOS开发之窥探UICollectionViewController(二) --详解CollectionView各种回调
UICollectionView的布局是可以自己定义的,在这篇博客中先在上篇博客的基础上进行扩充,我们先使用UICollectionViewFlowLayout,然后好好的介绍一下UICollectionView的一些回调方法,主要包括UICollectionViewDataSource,UICollectionViewDelegateFlowLayout,UICollectionViewDelegate相关回调方法,并通过实例来介绍每个回调的用法。并且给每个Section添加定制的Header和Foote
lizelu
2018/01/11
1.9K0
iOS开发之窥探UICollectionViewController(二) --详解CollectionView各种回调
推荐阅读
相关推荐
Objectiv-c - UICollectionViewLayout自定义布局-瀑布流Demo地址
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验