開發過程當中咱們常常會遇到稍微複雜的視圖須要tableView和collectionView的相互嵌套,那麼當cell嵌套tableView或者collectionView的時候怎麼讓cell自動佈局撐起來呢,這裏以cell嵌套collectionView爲例:git
使用collectionViewLayout.collectionViewContentSize來獲取collectionView的高度github
// 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);
}];
}
複製代碼
這樣是能夠實現,但有如下幾個問題佈局
若是在collectionView外層再加一層View就會出現部分機型計算的高度不許確ui
若是是cell嵌套的tableView呢,怎麼獲取tableView的高度,網上也有再reloadData後回到主線程獲取tableView的高度,這個時候是能夠獲取真實高度,但tableView不會更新,也會有問題。spa
經過重寫 - (CGSize)systemLayoutSizeFittingSize:(CGSize)targetSize withHorizontalFittingPriority:(UILayoutPriority)horizontalFittingPriority verticalFittingPriority:(UILayoutPriority)verticalFittingPriority 方法線程
cell是經過systemLayoutSizeFittingSize方法獲取contentView高度,而後加上分割線高度獲得cell的高度,所以重寫此方法返回真實高度應該是最有效的code
舉例:cell佈局以下cdn
- (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賦值blog
- (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見 github.com/icofans/Cel…