UITableView中嵌套UICollectionView自动算高

1.UITableView的设置:

预设高度
_table.rowHeight=UITableViewAutomaticDimension;

_table.estimatedRowHeight = 200;

2.自定义Cell中是个UICollectionView的设置

对cell中子View的约束可以用纯代码,也可以用xib,需要注意的是,不管用哪种方式都需要给UICollectionView加个ContainerView,这个ContainerView不是Cell.contentView,而是一个自定义的View,需要通过UICollectionView的高度撑开Container的高度,才能让自定义的Cell高度自适应。
下面纯代码的约束,用的Masonry约束方式,开始使用的SDAutoLayout约束方式,ContainerView的高度不能被撑开。
@interface TR_EquipmentPicturesCell : UITableViewCell

@property (strong, nonatomic)UIView * collectionContainer;

@property (strong, nonatomic) UICollectionView *collectionView;

@end
-(UIView*)collectionContainer{
    if (_collectionContainer==nil) {
        _collectionContainer = [[UIView alloc]initWithFrame:CGRectZero];
        [self.contentView addSubview:_collectionContainer];
        [_collectionContainer mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(self.contentView).offset(0);
            make.left.equalTo(self.contentView).offset(16);
            make.width.mas_equalTo(KScreenWidth-32);
            make.height.mas_equalTo(60);
            make.bottom.equalTo(self.contentView).offset(0);
        }];
    }
    return _collectionContainer;
}

疑问1:
为什么将宽度写死?
如果不将宽度写死,无法确定view的高度

-(UICollectionView*)collectionView{
    if (_collectionView==nil) {
        UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc]init];
        layout.minimumLineSpacing = 0;
        layout.minimumInteritemSpacing = 0;
        layout.sectionInset = UIEdgeInsetsMake(5, 0, 5, 0);
        _collectionView = [[UICollectionView alloc]initWithFrame:CGRectZero collectionViewLayout:layout];
        _collectionView.scrollEnabled = NO;
        _collectionView.scrollsToTop = NO;
        _collectionView.backgroundColor = [UIColor redColor];
        [_collectionView registerNib:[UINib nibWithNibName:@"TR_RerpairPictureCollectionViewCell" bundle:nil] forCellWithReuseIdentifier:cellID];
        [self.collectionContainer addSubview:_collectionView];
        [_collectionView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.edges.equalTo(self.collectionContainer);
        }];
        _collectionView.delegate = self;
        _collectionView.dataSource = self;
    }
    return _collectionView;
}

设置数据源设置完数据源之后需要更新ContainerView 的高度,这样才能更新cell的高度,这样就可以实现自动算高

- (void)setData{
    [self.collectionView reloadData];
    //立即layoutIfNeeded获取contentSize
    [self.collectionContainer layoutIfNeeded];
    CGFloat height = self.collectionView.collectionViewLayout.collectionViewContentSize.height;
    NSLog(@"高度123===%lf",height);
    [self.collectionContainer mas_updateConstraints:^(MASConstraintMaker *make) {
        make.height.mas_equalTo(height);
    }];
}

你可能感兴趣的:(UITableView中嵌套UICollectionView自动算高)