当前位置: 首页 > 编程日记 > 正文

【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实现瀑布流






相关文章:

python之文件

1、什么是文件指针? 文件指针 文件指针标记从哪个位置开始读取数据 第一次打开文件时,通常文件指针会指向文件的开始位置 当执行了read方法后,文件指针会移动到读取内容的末尾 创建一个当前目录下的文件pass 内容为: westos …

一个6年的菜鸟,在4年之前做的一些功能(二)

前戏:针对上一篇列出来的功能点,今天和大家分享下这个自定义的公式是怎么设计的,由于我的第一篇博客在首页被管理员移走了,大家可以点击这里来跳转,看下第一篇的目录结构。本人作为老菜鸟,和大家分享的也是…

Oracle11.2新特性之listagg函数 (行列转换)

SELECT regexp_substr(公司1,贵公司2, [^,], 1, LEVEL, i) FROM dualCONNECT BY LEVEL < length(公司1,贵公司2) - length(REPLACE(公司1,贵公司2, ,, )) 1 以上为字符串带分隔符的转换为列 Oracle11.2新增了LISTAGG函数&#xff0c;可以用于字符串聚集&#xff0c;测试如下…

Mac 安装Android Studio

一、下载 可以通过以下这些网站下载Mac版的Android Studio http://www.androiddevtools.cn http://www.android-studio.org 二、安装 双击下载好的dmg文件&#xff0c;拖曳安装。 拷贝完成之后&#xff0c;在应用程序中打开Android Studio。这时候会引导进行环境安装和设置…

iscsi网络磁盘共享

iscsi(Internet SCSI)支持从客户端&#xff08;发起端&#xff09;通过IP向远程服务器上的ISCSI存储设备&#xff08;目标&#xff09;发送scsi命令。ISCSI限定名称用于确定发起端和目标&#xff0c;并采用iqn.yyy-mm.{reverse domain}:label的格式。 默认情况下&#xff0c;网…

转: IO设计模式:Reactor和Proactor对比

转: https://segmentfault.com/a/1190000002715832 平时接触的开源产品如Redis、ACE&#xff0c;事件模型都使用的Reactor模式&#xff1b;而同样做事件处理的Proactor&#xff0c;由于操作系统的原因&#xff0c;相关的开源产品也少&#xff1b;这里学习下其模型结构&#xff…

程序员该怎样放松?8个好网站推荐

1&#xff09;看风景程序员每天在液晶屏幕下工作很长时间&#xff0c;应该让干涩的眼睛得到好好的放松&#xff0c;偶尔看看窗外的绿树或远处的风景可能是不错的方式&#xff0c;但是这在北京上海广州这样的大城市里不太现实&#xff0c;所以这里推荐一个纯粹的分享旅行照片的网…

【iOS】UIButton 图标在上文字在下

iOS默认的UIButton是图片在左文字在右&#xff0c;但是很多时候需求是图片在上文字在下&#xff08;如效果图1、效果图2&#xff09;&#xff0c;因此想到&#xff0c;通过写一个JXButton继承自UIButton&#xff0c;并重写相关方法即可&#xff0c;以后项目中需要用的话就直接使…

多线程和mysql

多线程 1、多线程的定义&#xff1a; 什么是线程&#xff1a; 线程是操作系统能够进行运算调度的最小单位&#xff08;程序执行流的最小单元&#xff09;。它被包含在进程之中&#xff0c; 是进程中的实际运作单位。一个进程中可以并发多个线程&#xff0c;每条线程并行执行不…

poj2154-color-polyan次二面体+欧拉函数优化

N<1e9,O(nlogn)的做法会超时。从枚举置换转变为枚举轮换长度&#xff0c;然后可以利用欧拉函数&#xff0c;把复杂度变为O(√n * logn) 1 /*--------------------------------------------------------------------------------------*/2 3 #include <algorithm>4 #in…

【iOS】通讯录分组方式展示数据

本例子是将后台返回的医生列表&#xff08;包含姓名和电话&#xff0c;demo从plist文件读取&#xff09;&#xff0c;按拼音进行分组显示(A-Z)&#xff0c;最终效果如下图&#xff1a; 一、创建Doctor医生类: Doctor类属性包括姓名、电话以及姓名第一个字的拼音首字母&#xff…

LVS_DR实现(负载均衡)及LVS_DR+keepalived实现(高可用+负载均衡)

client->VS->RS->client(VS只做调度,RS为虚拟服务器) LVS_DR原理图解&#xff1a; 优点&#xff1a;负载均衡器只负责将请求包分发给物理服务器&#xff0c;而物理服务器将应答包直接发给用户。所以&#xff0c;负载均衡器能处理 很巨大的请求量&#xff0c;这种方式…

【LeetCode】136. Single Number 解题小结

题目&#xff1a; Given an array of integers, every element appears twice except for one. Find that single one. Note:Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? 这题目的要求不仅是要求是线性时间…

iOS小技巧积累

平时项目中用到的&#xff0c;记录下来&#xff08;持续更新&#xff09;。1.在导航栏右边添加多个UIBarButtonItemUIBarButtonItem *searchScheduleBtn [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:"search_small"] style:UIBarButtonItemStylePl…

(转)iPhone开发经典语录集锦

1&#xff1a;如果无法保证子类行为的一致性&#xff0c;那么就用委托 If the subClass cannt keep with superClass,use delegate rather than inheritance. 2:屏幕上看到的&#xff0c;都是UIVew Everything you see on Screen is UIView. 3:如果对性能要求高&#xff0c;慎…

varnish 实现 CDN 缓存系统构建

cdn 搭建 (server1:172.25.1.1 ) : [roottest1 ~]# ls varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm [roottest1 ~]# yum install * -y [roottest1 ~]# cd /etc/varnish/ [roottest1 varnish]# vim /etc/sysconfig/varnish [roottest1 varnish]# sysct…

创建第一个 local network(I) - 每天5分钟玩转 OpenStack(80)

在 ML2 配置文件中 enable local network 后&#xff0c;本节将开始创建第一个 local network。 我们将通过 Web GUI 创建第一个 local network。 首先确保各个节点上的 neutorn agent 状态正常。GUI 菜单 为 Admin -> System -> System Infomation -> Neutron Agents…

【Android】AsyncTask异步类

一、关于AysncTask AsyncTask使得多线程编程更加简单&#xff0c;AsyncTask能在后台线程执行异步任务&#xff0c;并且在UI线程更新界面&#xff0c;而不再需要用户去操作Thread和Handler。AysncTask是一个抽象类&#xff0c;类关系如下&#xff1a; public abstract class As…

高手速成android开源项目【blog篇】

主要介绍那些乐于分享并且有一些很不错的开源项目的个人和组织。Follow大神&#xff0c;深挖大神的项目和following&#xff0c;你会发现很多。 一、个人 JakeWharton 就职于SquareGithub地址&#xff1a;https://github.com/JakeWharton代表作&#xff1a;ActionBarSherlock&a…

3、LVS_TUN实现负载均衡

LVS_TUN实现负载均衡 LVS 介绍: LVS 是 Linux Virtual Server 的简称,在实际环境中经常作为 B/S 结构的网络应用中的负载均衡器来使用,工作在 7 层网络模型中的,网络层,也就是通常说的 IP 层,由于数据的处理是在 Linux 内核态完成的,所以相对反向代理服务器来说,性能一般会高一…

【Android】Fragment官方中文文档

以下内容来自Android官方文档。 Fragment 表示 Activity 中的行为或用户界面部分。您可以将多个片段组合在一个 Activity 中来构建多窗格 UI&#xff0c;以及在多个 Activity 中重复使用某个片段。您可以将片段视为 Activity 的模块化组成部分&#xff0c;它具有自己的生命周期…

关于MSSQL导入导出时主键与约束丢失的问题解决

导入数据时&#xff0c;使用默认选项&#xff0c;会丢失主键、约束、默认值等属性&#xff0c;按如下步骤操作&#xff1a;-->导出向导 -->选择数据源 -->选择目的 -->指定表复制或查询&#xff1a;不要使用默认选项&#xff0c;选择“在SQL Server数据库之间复制对…

Java5中的线程池实例讲解

Java5增加了新的类库并发集java.util.concurrent&#xff0c;该类库为并发程序提供了丰富的API多线程编程在Java 5中更加容易&#xff0c;灵活。本文通过一个网络服务器模型&#xff0c;来实践Java5的多线程编程&#xff0c;该模型中使用了Java5中的线程池&#xff0c;阻塞队列…

LNMP架构的搭建

LNMP 架构的搭建 基础架构图 环境&#xff1a; server5: nginx mysql php //需要的安装包 (蓝色为解压后的文件) [roottest5 ~]# /etc/init.d/iptables stop //关掉防火墙 MYSQL 源码安装 [roottest6 ~]#yum install -y gcc gcc-c make ncurses-devel bison opens…

NSString属性什么时候用copy,什么时候用strong?

我们在声明一个NSString属性时&#xff0c;对于其内存相关特性&#xff0c;通常有两种选择(基于ARC环境)&#xff1a;strong与copy。那这两者有什么区别呢&#xff1f;什么时候该用strong&#xff0c;什么时候该用copy呢&#xff1f;让我们先来看个例子。 示例 我们定义一个类…

hihocoder 1152 Lucky Substrings

#1152 : Lucky Substrings 时间限制:10000ms单点时限:1000ms内存限制:256MB描述 A string s is LUCKY if and only if the number of different characters in s is a fibonacci number. Given a string consisting of only lower case letters, output all its lucky non-empt…

随笔,记2014忆往昔岁月

博客园开通了一年多&#xff0c;这是第一篇博客。在此记下我的第一篇博客&#xff0c;同时&#xff0c;回忆过去几年自己的工作所得所想所感。 大学毕业&#xff0c;工作两年半了&#xff0c;做过很多事&#xff0c;比较杂&#xff0c;做过需求&#xff0c;做过设计&#xff0c…

PHP相关关系及定义

CGI(是一种协议): 是为了保证web server传递过来的数据是标准格式的&#xff0c;方便CGI程序的编写者。 web server&#xff08;如nginx&#xff09;是内容的分发者。 处理静态页面&#xff1a; 如果请求/index.html&#xff0c;web server就可以解…

Apache优化:修改最大并发连接数

http://www.365mini.com/page/apache-concurrency-configuration.htm Apache是一个跨平台的web服务器&#xff0c;由于其简单高效、稳定安全的特性&#xff0c;被广泛应用于计算机技术的各个领域。现在&#xff0c;Apache凭借其庞大的用户数&#xff0c;已成为用户数排名第一的…

黑马程序员___Java基础[02-Java基础语法](一)

Java语言基础组成 一、关键字 1)定义&#xff1a;被Java语言赋予了特殊含义的单词 2)特点&#xff1a;关键字中所有字母均为小写 3)作用及分类&#xff1a; 下面是Java语言保留专用的50个关键字&#xff1a; 用于定义数据类型的关键字&#xff08;12个&#xff09;&#xff1a;…