Collection view自定义布局

一般我们自定义布局都会新建一个类,继承自UICollectionViewFlowLayout,然后重写几个方法:

  • prepareLayout():当准备开始布局时调用这个方法,可以在这里计算一些属性,比如cell的尺寸。
  • layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]?:在这里返回布局属性。

实例(比较简单的例子,实际开发中可以进行更多的封装)

第一步:声明两个属性

    // MARK: 属性
/** cell的个数 */
var itemCount: Int? /** 布局信息 */
var layoutAttributes = [UICollectionViewLayoutAttributes]()

第二步:重写prepareLayout方法,计算布局属性

    // MARK: 准备布局
override func prepareLayout() {
super.prepareLayout() // 计算每个cell的宽度
let width = (UIScreen.mainScreen().bounds.size.width - self.sectionInset.left - self.sectionInset.right - minimumInteritemSpacing) / 2.0 // 判断itemCount是否为空
if itemCount != nil {
// 开始计算每个cell的布局属性
calculationAttribute(withItemWidth: width)
}
}
func calculationAttribute(withItemWidth itemWidth: CGFloat) {
// 声明数组 保存每一列的总高度 (两列)
let column1 = sectionInset.top, column2 = sectionInset.top
var columnArray: [CGFloat] = [column1, column2] for index in 0..<itemCount! {
// 创建indexPath 因为是示例 所以排版固定在一组
let indexPath = NSIndexPath(forItem: index, inSection: 0)
// 创建布局属性 通过indexPath
let attribute = UICollectionViewLayoutAttributes(forCellWithIndexPath: indexPath)
// 创建一个随机高度
let itemHeight = CGFloat(arc4random()%150 + 100) // columnNumber 记录定义的是哪一列
var columnNumber: CGFloat
if columnArray[0] < columnArray[1] {
columnArray[0] += itemHeight + self.minimumLineSpacing
columnNumber = 0
} else {
columnArray[1] += itemHeight + self.minimumLineSpacing
columnNumber = 1
} // 设置item的位置
let x = self.sectionInset.left + (self.minimumLineSpacing + itemWidth) * columnNumber
let y = columnArray[Int(columnNumber)] - itemHeight - self.minimumLineSpacing
attribute.frame = CGRectMake(x, y, itemWidth, itemHeight) layoutAttributes.append(attribute)
}
// 当设置完所有item的位置后需要设置itemsize 这样才能保证滚动时能显示所有的cell
// itemsize的height属性 是取最高的那列的平均值
if columnArray[0] > columnArray[1] {
self.itemSize = CGSizeMake(itemWidth, (columnArray[0] - sectionInset.top) * 2 / CGFloat(itemCount!) - self.minimumLineSpacing)
} else {
self.itemSize = CGSizeMake(itemWidth, (columnArray[1] - sectionInset.top) * 2 / CGFloat(itemCount!) - self.minimumLineSpacing)
}
}

第三步:返回布局信息数组

    override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
return layoutAttributes
}

总结:这个例子是瀑布流的布局,如果需要别的布局需要在准备布局时计算,然后返回布局信息数组就可以了

Collection View 自定义布局(custom flow layout)的更多相关文章

  1. 自定义 Collection View 布局

    自定义 Collection View 布局 answer-huang 29 Mar 2014 分享文章 UICollectionView 在 iOS6 中第一次被引入,也是 UIKit 视图类中的一 ...

  2. iOS系列译文:自定义Collection View布局

    原文出处: Ole Begemann   译文出处: 黄爱武(@answer-huang).欢迎加入技术翻译小组. UICollectionView在iOS6中第一次被介绍,也是UIKit视图类中的一 ...

  3. Collection View Programming Guide for iOS---(四)---Using the Flow Layout

      Using the Flow Layout使用流布局 The UICollectionViewFlowLayout class is a concrete layout object that y ...

  4. 自定义Collection View布局

    转自answer-huang的博客 原文出自:Custom Collection View Layouts    UICollectionView在iOS6中第一次被介绍,也是UIKit视图类中的一颗 ...

  5. IOS UIView 03- 自定义 Collection View 布局

    注:本人是翻译过来,并且加上本人的一点见解. 前言 UICollectionView 在 iOS6 中第一次被引入,也是 UIKit 视图类中的一颗新星.它和 UITableView 共享一套 API ...

  6. Collection View Programming Guide for iOS---(六)---Creating Custom Layouts

    Creating Custom Layouts 创建自定义布局 Before you start building custom layouts, consider whether doing so ...

  7. Collection View Programming Guide for iOS---(三)---Designing Your Data Source and Delegate

      Designing Your Data Source and Delegate 设计你的数据源和委托 Every collection view must have a data source o ...

  8. Collection View Programming Guide for iOS---(二)----Collection View Basics

      Collection View Basics Collection View 基础 To present its content onscreen, a collection view coope ...

  9. Collection View Programming Guide for iOS---(七)---Custom Layouts: A Worked Example

    Custom Layouts: A Worked Example Creating a custom collection view layout is simple with straightfor ...

随机推荐

  1. SAP ABAP 日期相关函数

    获的两个日期之间的分钟数 data min TYPE i. CALL FUNCTION 'DELTA_TIME_DAY_HOUR' EXPORTING T1 = ' T2 = ' D1 = ' D2 ...

  2. Android面向HTTP协议发送post请求

    /** * 採用post请求的方式 * * @param username * @param password * @return null表示求得的路径有问题,text返回请求得到的数据 */ pu ...

  3. 最严格的身份证校验(JavaScript版)

    在JavaWeb研发过程中为了获取有效的用户信息,校验其数据的有效性非常是必要,以下贴出在项目中用到的关于身份证的校验: <!DOCTYPE HTML PUBLIC "-//W3C// ...

  4. C#面向对象(二)

    一:抽象方法 1. 在面向对象编程语言中抽象方法指一些只有方法声明,而没有具体方法体的方法.抽象方法一般存在于抽象类或接口中. 在一些父类中,某些行为不是非常明确,因此无法用代码来具体实现,但是类还必 ...

  5. 如何快速学习bootstrap

    bootstrap中文网http://www.bootcss.com/解决了我所有使用bootstrap的问题,从0开始,下面的全部链接都是该网站的子链接.例子http://v3.bootcss.co ...

  6. s标签可以if elseif else

    首先引用s标签: <%@ taglib prefix="s" uri="/struts-tags" %> 使用s标签进行if elseif else ...

  7. BufferedWriter和BufferedReader使用方法

    /**  * 上传文件  * @param file  * @param path  * @param fileName  * @throws IOException  */ public void ...

  8. (转)C# 中的委托和事件

    来源:http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-In-CSharp.aspx 引言 委托 和 事件在 .Net ...

  9. LINQ数据库连接对象制造工厂

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  10. 检测SqlServer服务器IO是否瓶颈

    通过性能监视器监视 Avg. Disk Queue Length   小于2 Avg. Disk sec/Read , Avg. Disk sec/Write  小于10ms 可以用数据收集器定时收集 ...