UICollectionViewFlowLayout里面:

 // 方法一
- (void)prepareLayout{}
// 方法二:可以修改宽度,不能修改高度
- (nullable NSArray<__kindof UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect

贴出具体代码,注意方法二,要和一个带bool返回值的方法一块用:

 class CoverFlowLayout: UICollectionViewFlowLayout {

     // MARK: - 准备布局
override func prepare() {
super.prepare() scrollDirection = .horizontal let itemH = (collectionView?.bounds.size.height ?? ) * 0.8
let itemW = itemH
itemSize = CGSize(width: itemW, height: itemH) minimumLineSpacing =
} // MARK: - 只要显示的区域发生变化,就重新计算布局
// true - 只要显示的区域发生改变,就让布局失效; -> 重新计算布局,执行下面的方法
override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
return true
} // MARK: - 布局某表Rect中的所有cell
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { // 先获取系统布局好的结果
let oldAttsArray = super.layoutAttributesForElements(in: rect)! // 创建新集合
var tempArray = [UICollectionViewLayoutAttributes]() // 遍历集合,进行修改
for oldAtt in oldAttsArray{ // 这里不能直接修改,需先copy(否则控制台会输出错误)
let newAtt = oldAtt.copy() as! UICollectionViewLayoutAttributes // 屏幕中线位置
let screenCenterX = (collectionView?.bounds.size.width ?? ) * 0.5 + (collectionView?.contentOffset.x ?? ) // cell的中线
let itemCenterX = newAtt.center.x // 计算距离
let distance = screenCenterX - itemCenterX // 将距离转换成缩放比例
let scale = - abs(distance) / (collectionView?.bounds.size.width ?? ) let transform = CATransform3DIdentity
newAtt.transform3D = CATransform3DScale(transform, scale, scale, ) tempArray.append(newAtt)
} return tempArray
} }

协议方法 UICollectionViewDelegateFlowLayout:

 // 方法三:返回cell的size
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
if (indexPath.section == ) { //第0组
return CGSizeMake(collectionView.bounds.size.width, );
} if (indexPath.section == && indexPath.item == ) { //第一组的第0个
return CGSizeMake(collectionView.bounds.size.width, );
} CGFloat width = (collectionView.bounds.size.width - ) / ;
CGFloat height = ;
return CGSizeMake(width, height);
}

UICollectionView布局cell的三种方式的更多相关文章

  1. 创建cell的三种方式

    方式一 注册cell -> 无需为cell绑定标识符 [使用UIViewController完成!] l  1> static NSString * const ID = @"c ...

  2. Android 生成LayoutInflater的三种方式

    通俗的说,inflate就相当于将一个xml中定义的布局找出来. 因为在一个Activity里如果直接用findViewById()的话,对应的是setConentView()的那个layout里的组 ...

  3. 获得 LayoutInflater 实例的三种方式

    在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例 ...

  4. [转]获得 LayoutInflater 实例的三种方式

    转自:http://www.cnblogs.com/androidez/archive/2013/07/01/3164729.html 获得 LayoutInflater 实例的三种方式   在实际开 ...

  5. 【转】实现展开列ExpandableListView的三种方式之SimpleExpandableListAdapter实例

    原文网址:http://blog.csdn.net/x605940745/article/details/12099709 实现可扩展展开列ExpandableListView的三种方式 欢迎加入QQ ...

  6. Hadoop生态圈-注册并加载协处理器(coprocessor)的三种方式

    Hadoop生态圈-注册并加载协处理器(coprocessor)的三种方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 到目前为止,大家已经掌握了如何使用过滤器来减少服务器端通过 ...

  7. 解析Xml文件的三种方式及其特点

    解析Xml文件的三种方式 1.Sax解析(simple api  for xml) 使用流式处理的方式,它并不记录所读内容的相关信息.它是一种以事件为驱动的XML API,解析速度快,占用内存少.使用 ...

  8. [转]Asp.net Mvc2中重构View的三种方式

    本文转自:http://www.cnblogs.com/zhuqil/archive/2010/07/14/asp-net-mvc2-view-refactoring.html 我们在Asp.net ...

  9. Python|读、写Excel文件(三种模块三种方式)

    python读写excel的方式有很多,不同的模块在读写的讲法上稍有区别: 用xlrd和xlwt进行excel读写: 用openpyxl进行excel读写: 用pandas进行excel读写: imp ...

随机推荐

  1. 升讯威ADO.NET增强组件(源码):送给喜欢原生ADO.NET的你

    目前我们所接触到的许多项目开发,大多数都应用了 ORM 技术来实现与数据库的交互,ORM 虽然有诸多好处,但是在实际工作中,特别是在大型项目开发中,容易发现 ORM 存在一些缺点,在复杂场景下,反而容 ...

  2. Top Coder算法题目浏览器

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/top-code-offline-browser/ 关于 左耳朵耗子 ...

  3. Android动态改变布局

    遇到这么个需求,先看图:      其实是一个软件的登录界面,初始是第一个图的样子,当软键盘弹出后变为第二个图的样子,因为登录界面有用户名.密码.登录按钮,不这样的话软键盘弹出后会遮住登录按钮(其实之 ...

  4. xamarin MasterDetailPage点击Master时卡顿现象

    在很多项目中经常会使用到MasterDetailPage的布局方式,而且一般做为主页面来开发,在开发中,发现一个并不算Bug的问题,但是却发生了,以此记录下来,方便大家探讨. 现象是这样的,我开发了一 ...

  5. [转]Linux下g++编译与使用静态库(.a)和动态库(.os) (+修正与解释)

    在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库 ...

  6. HTML中的拖拉框----在路上(29)

    拖拽框---当鼠标按在指定的区域才可进行拖拽 思想:只有当鼠标是按在一个大div里的小div才可拖拽,其他不可:拖拽框有多种方法,这里以其中一种分享:下面使我自己写的demo,简单有效. <!D ...

  7. C#,.Net 学习资源

    原文:http://blog.csdn.net/chinacsharper/article/details/17514923一.网站1.http://msdn.microsoft.com/zh-CN/ ...

  8. 浅析MySQL二进制日志

    查看MySQL二进制文件中的内容有两种方式 1.  mysqlbinlog 2.  SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offs ...

  9. SpringMVC一路总结(二)

    冰冻三尺非一日之寒.对技术的学习尤其得遵循这么一个理.在<SpringMVC一路总结(一)>中,清楚的总结了SpringMVC的入门案例,对于这类入门demo,理清套路,整理思绪是最为重要 ...

  10. python中的str,unicode和gb2312

    实例1: v1=u '好神奇的问题!?' type(v1)->unicode v1.decode("utf-8")# not work,because v1 is unico ...