依赖库: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