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

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


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

  • 网上许多人都说这两种方法是可以自动适应高度的(图片网上找,自己懒得截图):
    在这里插入图片描述

但是经过我测试之后,发现上面的两种方法, 不管我是使用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无法自适应高度的情况,但是这种方式实现的原理 我也弄不清楚,但是效果很完美,如果有知道原理的,可以评论告诉我。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于UITableViewCell中包含WebView的自适应高度问题,一般的解决方案是在webViewDidFinishLoad方法中计算WebView的高度,并更新UITableViewCell高度。但是这种方法有时会出现计算不准确的情况,以及性能问题。 最新的解决方案是使用iOS 11中引入的UITableViewAutomaticDimension,结合约束自动布局来实现UITableViewCell自适应高度。具体步骤如下: 1. 在Storyboard或XIB中,设置UITableViewCell的约束,包括WebView的顶部、底部、左右两侧的约束,并将WebView的高度设置为大于等于0的值(可以是一个较小的值,比如10)。 2. 在tableView(_:cellForRowAt:)方法中,设置WebView的代理为当前的UITableViewCell,并在webView(_:didFinish:)方法中更新UITableViewCell高度: ```swift func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { // 计算WebView的内容高度 webView.evaluateJavaScript("document.readyState") { (result, error) in if result != nil { webView.evaluateJavaScript("document.body.offsetHeight", completionHandler: { (height, error) in if let height = height as? CGFloat { // 更新UITableViewCell高度 self.heightConstraint.constant = height self.setNeedsUpdateConstraints() self.updateConstraintsIfNeeded() self.layoutIfNeeded() self.delegate?.didUpdateHeight() } }) } } } ``` 3. 在tableView(_:estimatedHeightForRowAt:)方法中,返回一个估算的高度(可以是一个较小的值,比如100): ```swift func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return 100 } ``` 4. 在tableView(_:heightForRowAt:)方法中,返回UITableViewAutomaticDimension: ```swift func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension } ``` 注意:在使用约束自动布局的情况下,需要保证UITableViewCell高度约束是完整的,即顶部和底部都有约束,否则自适应高度可能会出现问题。同时,在更新UITableViewCell高度时,需要调用setNeedsUpdateConstraints、updateConstraintsIfNeeded和layoutIfNeeded方法,以保证约束的更新及时生效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值