OC CollectionView和TableView自身高度的隐式递归计算,改变父试图布局
CollectionView和TableView自身高度的隐式递归计算
1、前沿:我们一般会碰到这样的需求,一个tableview或者一个colletionview放在一个scrollview上边,而tableview和collectionview的cell是不可控的,更具请求内容变化而变化。如图:(标签的多少和标签的长度不一样,然而下边又有一个可以跟着滑动的view)

思路一:根据请求的内容一个一个计算宽度,然后计算行数,根据:表头+线宽(为了准确)+行间距*行间距个数+行高度*行数+区头+区尾;
我也这样考虑过,但是这样计算量不言而喻。
思路二:考虑最后一个cell的右下定点坐标加上一定的高度转化为tableview的高度,然后走了一点弯路:
cellForItemAtIndexPath//方法
使用隐式递归:(为什么叫隐式递归说明:因为不是写的递归算法,而是使用cell的重用算法)
- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
XYimprovenCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
CGPoint point = [cell convertPoint:CGPointMake(cell.width, cell.height) toView:self];
self.height = fabs(point.y) + ;
return cell;
}
让每一次cell的右边定点定于collection的高度;
问题:重用的时候是先加载cell然后赋值高度,不出现的时候将不加载。
然后使用:
- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath{
CGPoint point = [cell convertPoint:CGPointMake(cell.width, cell.height) toView:self];
self.height = fabs(point.y) + ;
if (indexPath.row == _titleArry.count - ) {//限制在最后一个cell加载时候才返回高度
if (self.allHeight) {
self.allHeight(self.height);
}
}
}
因为是cell的reload方法加载cell,在外边使用这个高度更新别的frame:
_improvenCollectionView.allHeight = ^(CGFloat height) {
STRONGSELF
//更新高度
strongSelf.bgScrollView.contentSize = CGSizeMake(SCREEN_WIDTH, strongSelf.improvenCollectionView.maxY + );
strongSelf.buttonSure.frame = CGRectMake(, + strongSelf.improvenCollectionView.maxY,SCREEN_WIDTH - *,);
};
是不是有种多么痛的领悟,转载请标明出处!
OC CollectionView和TableView自身高度的隐式递归计算,改变父试图布局的更多相关文章
- js 五种绑定彻底弄懂this,默认绑定、隐式绑定、显式绑定、new绑定、箭头函数绑定详解
壹 ❀ 引 可以说this与闭包.原型链一样,属于JavaScript开发中老生常谈的问题了,百度一搜,this相关的文章铺天盖地.可开发好几年,被几道this题安排明明白白的人应该不在少数(我就是 ...
- JS五种绑定彻底弄懂this,默认绑定、隐式绑定、显式绑定、new绑定、箭头函数绑定详解(转载)
目录 壹 ❀ 引 贰 ❀ this默认绑定 叁 ❀ this隐式绑定 1.隐式绑定 2.隐式丢失 肆 ❀ this显式绑定 伍 ❀ new绑定 陆 ❀ this绑定优先级 柒 ❀ 箭头函数的this ...
- swift学习 - tableView自适应高度1(xib autoLayout)
tableView自适应高度 效果图: 源码: class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSo ...
- 关于collectionView和tableView的两种cell的出列方法的区别
相信好多人一定会对collectionView和tableView的两种cell出列方法有所疑问,下面以UICollection为例子进行举例说明 假设我们已经创建了一个collectionView, ...
- 让tableView的高度等于contentSize的高度、动态调整tableView的高度、tableView的高度自适应布局
文章概要: 1.简介下,tableView中的内容如何高度自适应的布局 2.如何做到让tableView的高度动态调整 还是看图作文吧- 首先,tableView的高度就是用户能够看见里面更大世界的那 ...
- OC - 22.隐式动画
简介 每个UI控件,默认自动创建一个图层(根图层),即每个UI控件对应于至少一个图层 每一个UIView内部都默认关联着一个CALayer,我们可用称这个Layer为Root Layer(根层) ...
- 利用UICollectionViewFlowLayout的隐式动画实现UICollectionView的layout的动画调整(外加放大指定cell效果)
前几天在gitHub看到个不错的效果,就是DaiExpandCollectionView,效果如图: 所以赶紧下下来源码看看他怎么实现的,打开源码看了半天,发现他没写什么关于动画的代码啊... 经 ...
- grid - 隐式网格
当网格项目确认在显式网格之外时就会创建隐性网格,当没有足够的空间或者显式的网格轨道来设置网格项目,此时网格项目就会自动创建隐式网格. 隐式网格可以定义:grid-auto-rows.grid-auto ...
- oracle的隐式游标
游标的概念: 游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理, ...
随机推荐
- WPF 用代码增加路由事件的方法
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- net share列出了Windows的默认共享(包括C盘)
另外还有单独开启办法: 开启共享方法: 命令行方式:net share 博客=F:\娱乐\种子 我设置了一个名为“博客”的共享,路径为:“F:\娱乐\种子”. GUI方式:找到“F:\娱乐”的“种子” ...
- 在WPF中,如何得到任何Object对象的XAML代码?
原文:在WPF中,如何得到任何Object对象的XAML代码? 在WPF中,可以使用System.Windows.Markup.XamlWriter.Save(objName)得到任何Object对象 ...
- 基于IOCP的高速文件传输代码
//服务端: const //transmit用的参数 TF_USE_KERNEL_APC = $20; //命令类型 CMD_CapScreen = ...
- Expression Blend实例动画-大坝水位升高演示
原文:Expression Blend实例动画-大坝水位升高演示 Expression Blend是个很强大的东西,用它可以完成很多不好做的动画效果. 动画的主要元素: 时间线(Timeline) : ...
- 每日一题:Java异常处理
什么是异常 在理想情况下,程序总会运行在很完美的环境中,网络不会终端,文件一定存在,程序不会有 BUG.但是,理想很丰满,现实很骨干,实际生产环境中,网络可能会中断,文件可能会找不到,内存可能会溢出, ...
- WP8.1使用HttpClient类
Uri uri = new Uri("http://www.cnsos.net/weburl/index.htm", UriKind.Absolute); HttpClient m ...
- 批处理(bat)实现SQLServer数据库备份与还原
原文:批处理(bat)实现SQLServer数据库备份与还原 备份数据库.bat @echo off set path=%path%;C:\Program Files (x86)\Microsoft ...
- Devart Blog
How to combine data from several sources using SQL and VirtualQueryhttp://blog.devart.com/how-to-com ...
- Linux SD卡建立两个分区
本文主要介绍Linux 环境下 SD 卡建立两个分区的操作流程: 操作环境:Linux Ubuntu 2016.4 操作目的:将 SD 卡分为两个分区:第一分区格式为 FAT32,大小 500M.第二 ...