【iOS官方文档翻译】UICollectionView与UICollectionViewFlowLayout

(一)先来简单回顾一下UICollectionView

*UICollectionView的简单使用可以看我以前写的这篇博文:UICollectionView的基本使用

UICollectionView与UITableView很相似,必须实现两个代理:UICollectionViewDataSource和UICollectionViewDelegate,但是UICollectionView的展示的内容布局可以比UITableView更为多变和灵活,这主要是通过设置UICollectionView的collectionViewLayout属性来实现的。collectionViewLayout为UICollectionViewLayout抽象类的实例,一下是苹果官方对UICollectionViewLayout的简介:

(二)UICollectionViewLayout

UICollectionViewLayout类是一个抽象类,你可以继承它并生成collection view的布局信息。它的任务是决定cell、supplementary view和decoration view(关于这几个视图,看图1)的放置位置并且回应collection view的布局信息请求。然后collection view为对应的视图申请所提供的布局信息,以便它们能展示到屏幕上。

图1

根据上面苹果官方的说明,就是需要新建一个继承自UICollectionViewLayout的类,但是在这之前,苹果让我们先看看UICollectionViewFlowLayout类,这是苹果已经帮我们建立好的一个继承自UICollectionViewLayout的类,如果我们的布局并非十分特殊或复杂,并且是使用的流水布局(或网格布局),使用UICollectionViewFlowLayout将使得一切更为简单。下面看下官方对UICollectionViewFlowLayout的解释:

(三)UICollectionViewFlowLayout

UICollectionViewFlowLayout类用来管理网格布局(下文统一称为grid)中每一个项目视图、section的头部和尾部视图的具体布局。collection视图中的每一行(或一列)由尽可能多的cell来填充满,一行(或一列)放不下后,流动到下一行(或下一列),其中每一个cell的大小可以是一样的或不一样的。

一个flow layout与collection view的代理一起决定grid中每一个section中的每一项的大小、头部、尾部。代理对象须遵从UICollectionViewDelegateFlowLayout协议。使用代理可以动态地调节布局信息。例如,使用代理对象来说明grid中的每个cell使用不同的大小。如果不提供代理,flow layout会使用通过对象属性来设置的值作为默认值。

Flow layouts在排列内容时,会在某一个方向上使用固定的距离值,而在另一个方向上使用可滑动的距离值,例如,在一个垂直的可滑动grid中,内容的宽度是固定的(受限于collection view的宽度),而内容的高度是根据section和item的数目自动调节的。layout默认被设定为垂直的,可以使用scrollDirection 属性来修改滚动方向。

flow layout中每一个section都可以有自定义的头部或尾部。为了配置头部和尾部的view,必须设置头部或尾部的大小不为0。可以通过实现合适的代理方法或者给headerReferenceSize 和footerReferenceSize 属性设置合适的值。如果头部和尾部的大小是0,对应的view是不会添加到collectionview中的。

(四)下面是官方API中关于UICollectionViewFlowLayout的一些常用属性

@property(nonatomic) UICollectionViewScrollDirection scrollDirection
grid的滑动方向

@property(nonatomic) CGFloat minimumLineSpacing
每行之间最小的距离

@property(nonatomic) CGFloat minimumInteritemSpacing
每一行中每个item间的最小的距离

@property(nonatomic) CGSize itemSize
每一个items的默认大小

@property(nonatomic) CGSize estimatedItemSize
每一个items的估计大小(iOS8之后的属性,只要设置了estimatedItemSize,collection view 就会根据 cell 里面的 autolayout 约束去确定cell 的大小)

@property(nonatomic) UIEdgeInsets sectionInset
section里面内容的页边空白

@property(nonatomic) CGSize headerReferenceSize
section头部的默认大小

@property(nonatomic) CGSize footerReferenceSizesection
section尾部的默认大小

(五)UICollectionViewFlowLayout属性实例

下面我们就是用下面这篇博文中的示例代码来实践一下UICollectionViewFlowLayout:

UICollectionView的基本使用 :http://blog.csdn.net/dolacmeng/article/details/45583681

先看下不设置UICollectionView的collectionViewLayout属性时的效果(但是原来的示例代码使用了UICollectionViewDelegateFlowLayout代理中的sizeForItemAtIndexPath方法来设置cell的大小):

然后我们试一下使用UICollectionViewFlowLayout,我们修改viewDidLoad方法为如下:

- (void)viewDidLoad {
    [super viewDidLoad];
    UICollectionViewFlowLayout *floatLayout = [[UICollectionViewFlowLayout alloc] init];
    floatLayout.itemSize = CGSizeMake(100, 100); //设置每个cell的大小
    floatLayout.sectionInset = UIEdgeInsetsMake(10, 10, 10, 10);//设置内容的内边距
    floatLayout.minimumInteritemSpacing = 5;//设置每个cell之间的最小间距
    floatLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal;//设置滚动方向
    _collectionview.collectionViewLayout = floatLayout;
}

*因为修改UICollectionViewFlowLayout的属性值相当于修改了对应的默认值,因为最终的布局是由UICollectionViewFlowLayout和UICollectionViewDelegateFlowLayout代理方法共同决定,而我们已经实现了sizeForItemAtIndexPath方法,会覆盖itemSize属性的值,所以同时还要屏蔽掉sizeForItemAtIndexPath方法:

//-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
//        return CGSizeMake(120, 120);
//}

运行之后就得到了下图的效果(cell的尺寸缩小了/内边框为10/水平滚动):

(五)UICollectionViewFlowLayout方法实例

上面的示例中只是简单修改了视图的属性,有时候我们需要实现更多的显示需求,此时可以新建一个继承自UICollectionViewFlowLayout的类,并重写UICollectionViewFlowLayout父类中的一些方法:

- (CGSize)collectionViewContentSize
返回collection view的内容宽度和高度

(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
返回在给定的范围(rectangle)内所有cell的布局属性

(UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
返回指定位置的item的布局属性

(UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
Returns the layout attributes for the specified supplementary view.
返回具体某个supplementary view的布局属性

- (UICollectionViewLayoutAttributes *)layoutAttributesForDecorationViewOfKind:(NSString *)decorationViewKind atIndexPath:(NSIndexPath *)indexPath
返回具体某个decoration view的布局属性

(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
询问是否在显示的边界发生改变就进行重新布局

- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset?                                 withScrollingVelocity:(CGPoint)velocity

返回滑动后的内容偏移量(滑动所停止的点),默认返回proposedContentOffset参数的值,可以在这里返回我们实际需要的偏移量,详见Demo

- (void)prepareForCollectionViewUpdates:(NSArray *)updateItems
Notifies the layout object that the contents of the collection view are about to change.
通知布局对象collectionview的内容将要发生变化

实例代码可以参考我以前写的两篇博文:

iOS用UICollectionView实现Gallery效果iOS UICollectionView实现瀑布流

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-11 09:55:36

【iOS官方文档翻译】UICollectionView与UICollectionViewFlowLayout的相关文章

【iOS官方文档翻译】iOS蓝牙的基本概念

之前写了[iOS官方文档翻译]iOS的蓝牙连接.数据接收及发送一文,介绍了怎样进行蓝牙通讯,但是很多基本概念没有进行解释,看起来可能有点吃力,所以现在再翻译一篇苹果对官方蓝牙4.0一些基本概念介绍的文章. 1.中心设备和外围设备以及它们在蓝牙通讯中的角色. 在所有的BLE( Bluetooth low energy,下文简称蓝牙4.0 )通讯中都涉及2个主要的角色:中心设备和外围设备.它是基于传统的客户-服务器(主从式)结构,一般来说,外围设备有其它设备需要的数据,中心设备使用外围设备提供的数据

【转】【iOS官方文档翻译】iOS蓝牙的基本概念

原文地址:http://blog.csdn.net/dolacmeng/article/details/46489823 1.中心设备和外围设备以及它们在蓝牙通讯中的角色. 在所有的BLE( Bluetooth low energy,下文简称蓝牙4.0 )通讯中都涉及2个主要的角色:中心设备和外围设备.它是基于传统的客户-服务器(主从式)结构,一般来说,外围设备有其它设备需要的数据,中心设备使用外围设备提供的数据来完成特定的任务.像下图所示,心率监测器有有用的数据,Mac或者iOS APP需要这

【iOS官方文档翻译】iOS的蓝牙连接、数据接收及发送

说明:苹果官方开发文档中涉及一些名词:Central(中心设备).Peripheral(外围设备).advertising(广告).Services(服务).Characteristic(特征)等,我都用括号内的中文进行翻译,并且不做详细解释,可能存在误导,请谅解. 目录: 步骤1.建立一个Central Manager实例进行蓝牙管理 步骤2.搜索外围设备 步骤3.连接外围设备 步骤4.获得外围设备的服务 步骤5.获得服务的特征 步奏6.从外围设备读数据(直接读取和订阅两种方法) 步骤7.给外

iOS 官方文档翻译地址已经迁移到github上了

为了能让更多的人参与进来,已经托管到github上. 感兴趣的开发者,可以加入qq群486111671 地址:github 网址 版权声明:本文为博主原创文章,未经博主允许不得转载.

iOS Communicating with Authenticating HTTP Servers 与HTTP服务器通信认证 官方文档翻译(六)

原文地址:developer 召集翻译人手:请加入486111671  ios 官方文档翻译                                                            与HTTP服务器通信认证 本章描述了如何与HTTP服务器身份验证利用CFHTTPAuthentication API.它解释了如何找到匹配验证对象和凭证,将它们应用到一个HTTP请求,并将它们存储供以后使用. 一般来说,如果一个HTTP服务器将返回一个401或407响应后你的HTTP请求

Alljoyn瘦客户端库介绍(官方文档翻译)

Alljoyn瘦客户端库介绍(1) 1.简介 本文档对AllJoynTM瘦客户端的核心库文件(AJTCL)进行了详尽的介绍.本文档介绍了系统整体架构,AllJoyn框架结构,并着重于介绍如何将嵌入式设备加入AllJoyn系统整体架构中.1.1目的 本文档介绍了如何使一个受限于功耗.计算能力和内存的设备(嵌入式设备)加入AllJoyn分布式系统.具体而言,本文档包括了对AllJoyn面向嵌入式系统的方面的介绍,并着重描述了基于AllJoyn的系统的各个组件是如何与嵌入式设备协作以构建一个基于接近式

iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译

编号 iOS-Apple苹果官方文档翻译名称 博文链接地址 1 苹果API常用英语名词---iOS-Apple苹果官方文档翻译 http://www.cnblogs.com/ChenYilong/p/3495625.html 2 基本控件文档-UIWebView---iOS-Apple苹果官方文档翻译 http://www.cnblogs.com/ChenYilong/p/3556301.html 3 基本控件文档-UITextField属性---iOS-Apple苹果官方文档翻译 http:/

IOS基础_ UICollectionView的简单使用

和表格视图类似 UICollectionView的使用有两种方法 一种是继承UICollectionViewController,这个Controller会自带一个UICollectionView: 另外一种是创建一个UIConllectionView 视图放在普通的UIViewController里面. 我们用第二种 首先声明先声明一个重用标示  和实现委托 #define _CELL @"acell" @interface yxpViewController ()<UICol

IOS 瀑布流UICollectionView实现

IOS 瀑布流UICollectionView实现 在实现瀑布流之前先来看看瀑布流的雏形(此方法的雏形 UICollectionView) 对于UICollectionView我们有几点注意事项 它和tableView不一样,ContentView的内容完全需要我们自己去添加. 它与tableview相比,他的初始化需要FlowLayout并且大部分操作在其上. UIcollectionView的实用性极强,虽然有时他并不是最好的解决方案,但是它可以很灵活的实现各种效果. 图(一) 如图,模拟器