OC CollectionView和TableView自身高度的隐式递归计算,改变父试图布局
2024-10-02 02:50:16
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 - *,);
};
是不是有种多么痛的领悟,转载请标明出处!
最新文章
- 【Linux】重定向与管道
- MySQL Create Table创建表
- JavaScript 、jQuery动态创建元素的关键字~
- HDU-4035 Maze (概率DP求期望)
- Codeforces 600 E. Lomsat gelral (dfs启发式合并map)
- BestCoder Round #76 解题报告
- Cocos2d-x第一个坑,NDK 编译环境
- bzoj1293: [SCOI2009]生日礼物
- ip_conntrack 实现
- 百度编辑器umeditor使用总结
- select/**/*/**/from/**/RegSite
- iPad学做菜
- Knockout应用开发指南 第五章:创建自定义绑定
- MVC 怎么把string字符串转译成html格式
- JDFS:一款分布式文件管理系统,第三篇(流式云存储)
- JMeter 监听器之保存响应到文件
- leetcode33
- JavaScript -基础- 函数与对象(三)数组对象
- HTML之DocType的几种类型
- redis在windows上安装+RedisDesktopManager
热门文章
- [AC自己主动机+可能性dp] hdu 3689 Infinite monkey theorem
- windows添加本地文件托管到新增github库
- Angular使用echarts
- XF 开关控件
- 漫谈 JVM —— 内存模型、线程、锁
- WPF 数据模板的使用
- Delphi 10.2可以开发Linux桌面应用了
- layui 或者layer 父页面获取子页面数据 或者子页面获取父页面操作方法
- xadmin 无法创建xadmin_log 或者是xadmin源代码使用,没有引用xadmin包报错或 1146, ";Table 'mxonline.xadmin_log' doesn't exist";
- erp的核心代码,替代orm