博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 自动布局下UITableViewCell嵌套CollectionView
阅读量:6129 次
发布时间:2019-06-21

本文共 2522 字,大约阅读时间需要 8 分钟。

开发过程中我们经常会遇到稍微复杂的视图需要tableView和collectionView的相互嵌套,那么当cell嵌套tableView或者collectionView的时候怎么让cell自动布局撑起来呢,这里以cell嵌套collectionView为例:

方案1:

使用collectionViewLayout.collectionViewContentSize来获取collectionView的高度

// tableViewCell赋值- (void)setModel:(NSArray *)dataArr {    self.dataArr=dataArr;    [self.collectionView reloadData];    [self.collectionView layoutIfNeeded];    [self.collectionView mas_updateConstraints:^(MASConstraintMaker *make) {        make.height.mas_equalTo(self.collectionView.collectionViewLayout.collectionViewContentSize.height);    }];}复制代码

这样是可以实现,但有以下几个问题

  1. 如果在collectionView外层再加一层View就会出现部分机型计算的高度不准确

  2. 如果是cell嵌套的tableView呢,怎么获取tableView的高度,网上也有再reloadData后回到主线程获取tableView的高度,这个时候是可以获取真实高度,但tableView不会更新,也会有问题。

方案2:

通过重写 - (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize withHorizontalFittingPriority:(UILayoutPriority)horizontalFittingPriority verticalFittingPriority:(UILayoutPriority)verticalFittingPriority 方法

cell是通过systemLayoutSizeFittingSize方法获取contentView高度,然后加上分割线高度得到cell的高度,因此重写此方法返回真实高度应该是最有效的

举例:cell布局如下

- (void)setView{    [self.contentView addSubview:self.bgView];    [self.bgView addSubview:self.collectionView];        [self.bgView mas_makeConstraints:^(MASConstraintMaker *make) {        make.left.top.mas_equalTo(MAGIN16);        make.right.bottom.mas_equalTo(-MAGIN16);    }];        [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) {        make.left.bottom.top.right.mas_equalTo(0);    }];}复制代码

tableViewCell赋值

- (void)setModel:(NSArray *)dataArr {    self.dataArr=dataArr;    [self.collectionView reloadData];    [self.collectionView layoutIfNeeded];    [self.bgView layoutIfNeeded];}复制代码

计算高度

- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize withHorizontalFittingPriority:(UILayoutPriority)horizontalFittingPriority verticalFittingPriority:(UILayoutPriority)verticalFittingPriority{    // 先对bgview进行布局,这里需对bgView布局后collectionView宽度才会准确    self.bgView.frame = CGRectMake(0, 0, targetSize.width, 44);    [self.bgView layoutIfNeeded];        // 在对collectionView进行布局    self.collectionView.frame = CGRectMake(0, 0, targetSize.width-MAGIN16*2, 44);    [self.collectionView layoutIfNeeded];        // 由于这里collection的高度是动态的,这里cell的高度我们根据collection来计算    CGSize collectionSize = self.collectionView.collectionViewLayout.collectionViewContentSize;    CGFloat cotentViewH = collectionSize.height + MAGIN16*2;        return CGSizeMake([UIScreen mainScreen].bounds.size.width, cotentViewH);}复制代码

本文Demo见 

转载于:https://juejin.im/post/5d021571e51d45775d516f70

你可能感兴趣的文章
Vivado增量式编译
查看>>
一个很好的幻灯片效果的jquery插件--kinMaxShow
查看>>
微信支付签名配置正确,但返回-1,调不出支付界面(有的手机能调起,有的不能)...
查看>>
第二周例行报告
查看>>
如何使frame能居中显示
查看>>
第k小数
查看>>
构建之法阅读笔记三
查看>>
写给对前途迷茫的朋友:五句话定会改变你的人生
查看>>
并行程序设计学习心得1——并行计算机存储
查看>>
JAVA入门到精通-第86讲-半双工/全双工
查看>>
bulk
查看>>
js document.activeElement 获得焦点的元素
查看>>
C++ 迭代器运算
查看>>
【支持iOS11】UITableView左滑删除自定义 - 实现多选项并使用自定义图片
查看>>
day6-if,while,for的快速掌握
查看>>
JavaWeb学习笔记(十四)--JSP语法
查看>>
【算法笔记】多线程斐波那契数列
查看>>
java8函数式编程实例
查看>>
jqgrid滚动条宽度/列显示不全问题
查看>>
在mac OS10.10下安装 cocoapods遇到的一些问题
查看>>