UITableViewCell嵌套UICollectionView,Cell自适应高度问题

UITableViewCell嵌套UICollectionView,Cell自适应高度问题


有一个需求要求UITableViewCell中嵌套一个UICollectionView,然后cell的高度需要自动适应,在这个问题纠结了好久,网上找了许多资料,但是最终结果不如任意。
最终找到一种方法,试用之后效果完美。

  • 网上许多人都说这两种方法是可以自动适应高度的(图片网上找,自己懒得截图):
    UITableViewCell嵌套UICollectionView,Cell自适应高度问题_第1张图片

但是经过我测试之后,发现上面的两种方法, 不管我是使用masory和XIB布局 ,结果发现都是不可以的, 第一次进去的时候高度都是不对的,必须等到第二次在显示cell时,高度才回正常,打印之后发现,只有第二次获取的UICollectionView的高度才是对的 ,第一次显示高度不对,但是我目前还没有找到获取UICollectionView高度的正确时机

  • 第三种方式是直接根据model的个数据,UICollectionViewCell的高度 来直接计算整个UICollectionView的高度,然后更新,达到UITableViewCell自适应的高度,这种方法首先需要添加UICollectionView添加4边约束和一个高度约束,然后在获取正确的高度之后,修改UICollectionView的高度约束,但是控制台,会报一个约束冲突的警告
var model: Int = 0 {
        didSet {
            let count = model / 2
            let rem = model % 2

            collectionViewHieghtCons.constant = CGFloat((rem == 0 ? count : (count+1))*40) + CGFloat((rem == 0 ? count : (count+1))*15) - 15     
        }
    }

 func setupUI() -> Void {
        //布局
        contentView.addSubview(footListCollectionView)

        let dic = ["collectionView": footListCollectionView]

        contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[collectionView]-0-|", options: NSLayoutConstraint.FormatOptions.init(), metrics: nil, views: dic))
        contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[collectionView]-0-|", options: NSLayoutConstraint.FormatOptions.init(), metrics: nil, views: dic))        collectionViewHieghtCons = NSLayoutConstraint.init(item: footListCollectionView, attribute: NSLayoutConstraint.Attribute.height, relatedBy: NSLayoutConstraint.Relation.equal, toItem: nil, attribute: NSLayoutConstraint.Attribute.notAnAttribute, multiplier: 1.0, constant: 0)
        contentView.addConstraint(collectionViewHieghtCons)
    }
  • 第四种方式也是效果最完美的方式,在布局好之后重写一下方法,就达到完美效果:
 override func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize {
        
        footListCollectionView.frame = CGRect.init(x: 0, y: 0, width: targetSize.width, height: 44)
        footListCollectionView.layoutIfNeeded()
        
        let size = footListCollectionView.collectionViewLayout.collectionViewContentSize
        print("systemLayoutSizeFitting==  size=====\(size)")
        
        return CGSize.init(width: SCREEN_WIDTH, height: size.height)
    }

但是这种方式适合代码方式, 如果是XIB创建的cell,也会出现UITableViewCell无法自适应高度的情况,但是这种方式实现的原理 我也弄不清楚,但是效果很完美,如果有知道原理的,可以评论告诉我。

你可能感兴趣的:(Objective-c,ios,objective-c)