iOS

UITableViewCell嵌套UICollectionView布局

在不断填坑中前进。。

Posted by 三十一 on November 21, 2019

UITableViewCell嵌套UICollectionView布局

开发中经常遇到 cell 嵌套九宫格展示图片之类的需求,类似于下面的情况。

Simulator Screen Shot - iPhone 11 Pro Max - 2019-11-21 at 16.39.36

最简单的办法就是 cell 里面嵌套 collectionView,具体的做法是:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 的代理方法里面这样处理。


    OrderDetailsIntentionTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"OrderDetailsIntentionTableViewCell" forIndexPath:indexPath];
    [cell configModel:model];
    cell.frame = tableView.bounds;
    [cell layoutIfNeeded];
    [cell.collectionView reloadData];
    //heightConstraint 为内嵌的 collectionView 高度约束
    cell.heightConstraint.constant = cell.collectionView.collectionViewLayout.collectionViewContentSize.height;
    return cell;

OrderDetailsIntentionTableViewCell 里面这样设置 collectionView

    
    UICollectionViewLeftAlignedLayout *flowLayout = [[UICollectionViewLeftAlignedLayout alloc] init];
    flowLayout.minimumLineSpacing = 10;
    flowLayout.minimumInteritemSpacing = 10;
    flowLayout.sectionInset = UIEdgeInsetsMake(0, 10, 0, 10);//top, left, bottom, right
    
    self.collectionView.collectionViewLayout = flowLayout;
    self.collectionView.backgroundColor = [UIColor clearColor];
    self.collectionView.dataSource = self;
    self.collectionView.delegate = self;
    self.collectionView.scrollEnabled = NO;
    

这样写也行

	DispatchQueue.main.async(execute: {
			self.collectionView.snp.updateConstraints { (make) in
				make.edges.equalToSuperview().inset(UIEdgeInsets.init(top: 5, left: 10, bottom: 5, right: 10))
				make.height.equalTo(MAXFLOAT).priority(666)
			}
			self.collectionView.reloadData()
			self.collectionView.layoutIfNeeded()

			let height = self.collectionView.collectionViewLayout.collectionViewContentSize.height
			self.collectionView.snp.updateConstraints { (make) in
				make.edges.equalToSuperview().inset(UIEdgeInsets.init(top: 5, left: 10, bottom: 5, right: 10))
				make.height.equalTo(height).priority(666)
			}
			self.collectionView.SSY.parentTableView()?.beginUpdates()
			self.collectionView.SSY.parentTableView()?.endUpdates()

		})