iOS 自動佈局下UITableViewCell嵌套CollectionView

開發過程當中咱們常常會遇到稍微複雜的視圖須要tableView和collectionView的相互嵌套,那麼當cell嵌套tableView或者collectionView的時候怎麼讓cell自動佈局撐起來呢,這裏以cell嵌套collectionView爲例:git

方案1:

使用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);
    }];
}
複製代碼

這樣是能夠實現,但有如下幾個問題佈局

  1. 若是在collectionView外層再加一層View就會出現部分機型計算的高度不許確ui

  2. 若是是cell嵌套的tableView呢,怎麼獲取tableView的高度,網上也有再reloadData後回到主線程獲取tableView的高度,這個時候是能夠獲取真實高度,但tableView不會更新,也會有問題。spa

方案2:

經過重寫 - (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…

相關文章
相關標籤/搜索