UITableView 自适应Cell高度

前言:

针对Cell内子控件的内容而自动调整cell的高度我们称之为Cell自适应高度。其实现原理就是tableView设置高度自适应、关键子控件的顶部与底部要与 contentView相约束即可。

Cell子类:

import UIKit
import SnapKit

class MyCell: UITableViewCell {
    
    var cellImageView: UIImageView!
    var cellContentLabel: UILabel!
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        self.selectionStyle = UITableViewCell.SelectionStyle.none
        self.isUserInteractionEnabled = true
         
        installCellImageView()
        installCellCOntentLabel()
    }
    
    private func installCellImageView(){
        cellImageView = UIImageView()
        cellImageView.tag = 1001
        self.contentView.addSubview(cellImageView)
        
        cellImageView.snp.makeConstraints{ make in
            make.size.equalTo(35)
            make.left.equalTo(self.contentView.snp.left).offset(20)
            make.centerY.equalToSuperview()
        }
    }
    
    private func installCellCOntentLabel(){
        cellContentLabel = UILabel()
        cellContentLabel.numberOfLines = 0
        cellContentLabel.font = UIFont.systemFont(ofSize: 14)
        cellContentLabel.tag = 1002
        self.contentView.addSubview(cellContentLabel)
        
        /**
         * Key ponit.
         * 约束top至contentView的顶部向下偏移8,数值根据具体业务需求随意
         * 约束width由right与left具体而定,同时numberOfLines属性要为0
         * 约束底部至contentView的底部向上偏移5,数值根据具体业务需求随意
         */
        cellContentLabel.snp.makeConstraints{ make in
            make.top.equalTo(self.contentView.snp.top).offset(8)
            make.left.equalTo(self.cellImageView.snp.right).offset(20)
            make.right.equalTo(self.contentView.snp.right).offset(-20)
            make.bottom.equalTo(self.contentView.snp.bottom).offset(-5)
        }
    }
    
    // MARK: - Defalut method.
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

VC:

VC里面的重点就是estimatedRowHeight给个预估值,rowHeight属性设置为UITableView.automaticDimension即可。

import UIKit

class NotifViewController: UIViewController, UITableViewDataSource{
    
    var tableView: UITableView!
    var dataImage: Array<String> = ["ef", "ef","ef", "ef","ef", "ef","ef", "ef","ef", "ef"]
    var dataContent: Array<String> = ["Test text", "子曰:学而时习之,不亦说乎?有朋自远方来,不亦乐乎?人不知而不愠,不亦君子乎?","子禽问于子贡曰:“夫子至于是邦也,必闻其政,求之与?抑与之与?”子贡曰:“夫子温、良、恭、俭、让以得之。夫子之求之也,其诸异乎人之求之与?”", "子贡曰:“贫而无谄,富而无骄,何如?”子曰:“可也。未若贫而乐,富而好礼者也。”子贡曰:“《诗》云:‘如切如磋,如琢如磨’,其斯之谓与?”子曰:“赐也,始可与言《诗》已矣,告诸往而知来者。”", "5", "6", "7", "8", "9", "10"]
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataImage.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "MY_CELL", for: indexPath)
        
        let imageView = cell.viewWithTag(1001) as! UIImageView
        imageView.image = UIImage(named: dataImage[indexPath.row])
        
        let contentLabel = cell.viewWithTag(1002) as! UILabel
        contentLabel.text = dataContent[indexPath.row]
        
        return cell
    }
    
    private func initView(){
        tableView = UITableView(frame: self.view.frame, style: .plain)
        tableView.register(MyCell.self, forCellReuseIdentifier: "MY_CELL")
        tableView.estimatedRowHeight = 50
        tableView.rowHeight = UITableView.automaticDimension
        tableView.dataSource = self
        self.view.addSubview(tableView)
    }
    

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        
        initView()
    }
    
}

效果:

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值