美文网首页我的Swift开发
利用SnapKit约束-tableView动态计算cell高度(

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

作者: 爱恨的潮汐 | 来源:发表于2017-04-19 17:59 被阅读1050次
    依赖库: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布局后如何获取view的真实高宽呢?我使用whiteView.frame.size.width输出的结果为0.0
      • 舒马赫:用纯代码写界面是不是有点太慢了,随便一个界面都要一大坨代码,每改点东西还要重新运行,另外由于autolayout先天原因布局速度是比较慢的,会影响帧率。推荐使用xml的布局库FlexLib,采用前端布局标准flexbox(不使用autolayout),支持热刷新,自动计算高度等。可以到这里了解详细信息:

        https://github.com/zhenglibao/FlexLib

      本文标题:利用SnapKit约束-tableView动态计算cell高度(

      本文链接:https://www.haomeiwen.com/subject/kuyhzttx.html