開(kāi)發(fā)過(guò)程中我們經(jīng)常會(huì)遇到稍微復(fù)雜的視圖需要tableView和collectionView的相互嵌套,那么當(dāng)cell嵌套tableView或者collectionView的時(shí)候怎么讓cell自動(dòng)布局撐起來(lái)呢,這里以cell嵌套collectionView為例:

方案1:
使用collectionViewLayout.collectionViewContentSize來(lái)獲取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);
}];
}
這樣是可以實(shí)現(xiàn),但有以下幾個(gè)問(wèn)題
如果在collectionView外層再加一層View就會(huì)出現(xiàn)部分機(jī)型計(jì)算的高度不準(zhǔn)確
如果是cell嵌套的tableView呢,怎么獲取tableView的高度,網(wǎng)上也有再reloadData后回到主線程獲取tableView的高度,這個(gè)時(shí)候是可以獲取真實(shí)高度,但tableView不會(huì)更新,也會(huì)有問(wèn)題。
方案2:
通過(guò)重寫(xiě) - (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize withHorizontalFittingPriority:(UILayoutPriority)horizontalFittingPriority verticalFittingPriority:(UILayoutPriority)verticalFittingPriority 方法
cell是通過(guò)systemLayoutSizeFittingSize方法獲取contentView高度,然后加上分割線高度得到cell的高度,因此重寫(xiě)此方法返回真實(shí)高度應(yīng)該是最有效的
舉例: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];
}
計(jì)算高度
- (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize withHorizontalFittingPriority:(UILayoutPriority)horizontalFittingPriority verticalFittingPriority:(UILayoutPriority)verticalFittingPriority
{
// 先對(duì)bgview進(jìn)行布局,這里需對(duì)bgView布局后collectionView寬度才會(huì)準(zhǔn)確
self.bgView.frame = CGRectMake(0, 0, targetSize.width, 44);
[self.bgView layoutIfNeeded];
// 在對(duì)collectionView進(jìn)行布局
self.collectionView.frame = CGRectMake(0, 0, targetSize.width-MAGIN16*2, 44);
[self.collectionView layoutIfNeeded];
// 由于這里collection的高度是動(dòng)態(tài)的,這里cell的高度我們根據(jù)collection來(lái)計(jì)算
CGSize collectionSize = self.collectionView.collectionViewLayout.collectionViewContentSize;
CGFloat cotentViewH = collectionSize.height + MAGIN16*2;
return CGSizeMake([UIScreen mainScreen].bounds.size.width, cotentViewH);
}
本文Demo見(jiàn) https://github.com/icofans/CellNestCollectionViewDemo