利用SnapKit约束-tableView动态计算cell高度(Swift)

依赖库:SnapKit
一、控制器

import UIKit

class XLRootViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
    //懒加载tableview
    private lazy var tableViewMain :UITableView = UITableView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height), style: UITableViewStyle.plain)

    //懒加载数据源-可变数组用Var,类型自动推导,数组字典都用[]
    private lazy var dataSouce :[String] = [String]()

    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //数据
        self.dataSouce += ["我就两个字","中新网4月17日电  据韩联社报道,韩国海洋水产部(简称“海水部”)“世越号”现场处理本部和负责世越号船体清理工作的韩国打捞局(Korea Salvage)为方便搜寻失踪者遗体的工作人员开展工作已于17日完成护栏安装,预计失踪者遗体搜寻工作有望于18日正式启动","这是第三个","3月28日,在将“世越”号船体运往木浦新港前,工作人员也同样在半潜船甲板上发现过动物尸骨。本月2日,工作人员曾在半潜船甲板上发现9块动物尸骨、“世越”号船长李某的护照及手提包、信用卡、圆珠笔等物品,但截至目前仍未发现9名失踪者的遗体。","","2014年4月16日,“世越”号在全罗南道珍岛郡附近水域沉没,共致295人遇难,迄今仍有9人下落不明,遇难者大多是学生。"]
        
        //创建UI
        self.createUI()
   
    }
    func createUI(){
        //标题
        self.title = "自动布局"
        //tableview
        self.view.addSubview(tableViewMain)
         //去分割线
//        tableViewMain.separatorStyle = UITableViewCellSeparatorStyle.none
        tableViewMain.delegate = self
        tableViewMain.dataSource = self
        //注册cell重用
        tableViewMain.register(XLLeftCell.self , forCellReuseIdentifier: "ID")

         //开启自动计算高度
        //【重点】注意千万不要实现行高的代理方法,否则无效:heightForRowAt
        tableViewMain.estimatedRowHeight = 44//预估高度,随便设置
        tableViewMain.rowHeight = UITableViewAutomaticDimension
    }
    
    
//代理方法
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        return dataSouce.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       
        let cell = tableView.dequeueReusableCell(withIdentifier:"ID") as! XLLeftCell
        //cell样式,取消选中
        cell.selectionStyle = .none
        //传值
        cell.getTitle(contain: dataSouce[indexPath.row])
        
        return cell
     }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}


二、cell层
import UIKit

class XLLeftCell: UITableViewCell {
    //标题
    private lazy var labelTitle:UILabel = UILabel()
    //图片
    private lazy var imagePhone : UIImageView = UIImageView()
    
    //内容
    private lazy var labelContronter : UILabel = UILabel()
    
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    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
    }

    
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {

        super.init(style: style, reuseIdentifier: reuseIdentifier)
        
        //创建UI
        self.InitUI()
    }
    
    
    fileprivate func InitUI(){

        //标题 【重点】必须在创建第一块控件的时候约束:contentView
        labelTitle.numberOfLines = 0
        labelTitle.backgroundColor = UIColor.white
        contentView.addSubview(labelTitle)
        labelTitle.snp.makeConstraints({ (make) in
            
            make.top.equalTo(contentView).offset(10)
            make.left.equalTo(10)
            make.right.equalTo(-10)
        })
        
        
        //图片
        imagePhone.image = UIImage(named: "photo.jpg")
        imagePhone.contentMode = .scaleAspectFill
        imagePhone.clipsToBounds = true
        
        contentView.addSubview(imagePhone)
        imagePhone.snp.makeConstraints { (make) in
            make.top.equalTo(labelTitle.snp.bottom).offset(20)
            make.left.equalTo(10)
            make.right.equalTo(-10)
            make.height.equalTo(200)
        }
        
        //内容 【重点】必须在创建最后一块控件的时候约束:contentView
        contentView.addSubview(labelContronter)
        labelContronter.isUserInteractionEnabled = true
       
        //添加点击手势
        let tapGesture = UITapGestureRecognizer(target: self, action:#selector(Actionbuton))
        labelContronter.addGestureRecognizer(tapGesture)
        
        labelContronter.numberOfLines = 0
        labelContronter.textColor = UIColor.red
        labelContronter.snp.makeConstraints { (make) in
          make.top.equalTo(imagePhone.snp.bottom).offset(15)
          make.left.equalTo(10)
          make.right.equalTo(-10)
          make.bottom.equalTo(contentView).offset(-20)
        }
    
    }
    
    func Actionbuton() {
        print("点击了label")
    }
    
    //控制器传过来的值赋值
    internal func getTitle(contain:String){
        //标题
        labelTitle.text = contain
        //内容
        labelContronter.text = contain
    }
}


github demo下载连接(包含OC版和Swift版):https://github.com/micheng23/tableView-cellHighly

你可能感兴趣的:(利用SnapKit约束-tableView动态计算cell高度(Swift))