ios中collection系统自带有几种布局

发布网友 发布时间:2022-04-20 21:27

我来回答

1个回答

热心网友 时间:2022-07-12 01:17

UICollectionView在iOS6中第一次被介绍,也是UIKit视图类中的一颗新星。它和UITableView共享API设计,但也在UITableView上做了一些扩展。UICollectionView最强大、同时显著超出UITableView的特色就是其完全灵活的布局结构。在这篇文章中,我们将会实现一个相当复杂的自定义collection view布局,并且顺便讨论一下这个类设计的重要部分。项目的示例代码在GitHub上。

布局对象
UITableView和UICollectionView都是由data-source和delegate驱动的。他们为其显示的子视图集扮演为愚蠢的容器(mb containers),对他们真实的内容(contents)毫不知情。

UICollectionView进一步抽象了。它将其子视图的位置,大小和外观的控制权委托给一个单独的布局对象。通过提供一个自定义布局对象,你几乎可以实现任何你能想象到的布局。布局继承自UICollectionViewLayout这个抽象基类。iOS6中以UICollectionViewFlowLayout类的形式提出了一个具体的布局实现。

flow layout可以被用来实现一个标准的grid view,这可能是在collection view中最常见的使用案例了。尽管大多数人都这么想,但是Apple很聪明,没有明确的命名这个类为UICollectionViewGridLayout。而使用了更为通用的术语flow layout,这更好的描述了该类的能力:它通过一个接一个的放置cell来建立自己的布局,当需要的时候,插入横排或竖排的分栏符。通过自定义滚动方向,大小和cell之间的间距,flow layout也可以在单行或单列中布局cell。实际上,UITableView的布局可以想象成flow layout的一种特殊情况。

在你准备自己写一个UICollectionViewLayout的子类之前,你需要问你自己,你是否能够使用UICollectionViewFlowLayout实现你心里的布局。这个类是很容易定制的,并且可以继承本身进行近一步的定制。感兴趣的看这篇文章。

Cells和其他Views
为了适应任意布局,collection view建立一个了类似,但比table view更灵活的视图层级(view hierarchy)。像往常一样,你的主要内容显示在cell中,cell可以被任意分组到section中。Collection view的cells必须是UICollectionViewCell的子类。除了cells,collection view额外管理着两种视图:supplementary views和decoration views。

collection view中的Supplementary views相当于table view的section header和footer views。像cells一样,他们的内容都由数据源对象驱动。然而,和table view中用法不一样,supplementary view并不一定会作为header或footer view;他们的数量和放置的位置完全由布局控制。

Decoration views纯粹为一个装饰品。他们完全属于布局对象,并被布局对象管理,他们并不从数据源获取他们的contents。当布局对象指定它需要一个decoration view的时候,collection view会自动创建,并为其应用布局对象提供的布局参数。并不需要准备任何自定义视图的内容。

Supplementary views和decoration views必须是UICollectionResuableView的子类。每个你布局所使用的视图类都需要在collection view中注册,这样当data source让他从reuse pool中出列时,它才能够创建新的实例。如果你是使用的Interface Builder,则可以通过在可视编辑器中拖拽一个cell到collection view上完成cell在collection view中的注册。同样的方法也可以用在supplementary view上,前提是你使用了UICollectionViewFlowLayout。如果没有,你只能通过调用registerClass:或者registerNib:方法手动注册视图类了。你需要在viewDidLoad中做这些操作。
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com