前言:
针对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()
}
}