SnapKit - UITableView 高度不随单元格的动态内容而变化

Posted

技术标签:

【中文标题】SnapKit - UITableView 高度不随单元格的动态内容而变化【英文标题】:SnapKit - UITableView height is not change with dynamical content of cell 【发布时间】:2018-10-09 20:32:06 【问题描述】:

我是SnapKit的初学者,我想用SnapKit实现一个UITableViewController,每行有两个UILabel,一个是Title,另一个是Value。 我的问题是 UITableView 中行的高度没有根据每行的内容而改变。 这是我的代码: 类视图控制器:

import UIKit
import SnapKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 

// MARK: Property List
var list: NSMutableArray?
let myTableView: UITableView = 
   let table = UITableView()
    return table
()

//MARK: Life Cycle
override func viewDidLoad() 
    super.viewDidLoad()
    self.myTableView.rowHeight = UITableView.automaticDimension
    self.myTableView.estimatedRowHeight = 100
    title = "TableView Page"
    setup()
    setupViews()



// MAKR: Setup View
func setup() 
    self.view.backgroundColor = .white
    navigationController?.navigationBar.prefersLargeTitles = true


func setupViews () 
    self.view.addSubview(myTableView)
    myTableView.snp.makeConstraints  make in
        make.top.left.bottom.right.equalTo(10)
    
    myTableView.register(CustomCell.self, forCellReuseIdentifier: CustomCell.customCell)
    myTableView.delegate = self
    myTableView.dataSource = self


// MARK: TableView DataSource
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return 10


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    let cell = tableView.dequeueReusableCell(withIdentifier: CustomCell.customCell, for: indexPath) as! CustomCell
    cell.title.text = "title is lognest??"
    cell.value.text = (indexPath.row % 2 == 0) ?
     "longest value longest value longest value longest value longest value longest value longest value for text"
        : "short value"
    cell.title.snp.makeConstraints  (make) in
        make.top.equalTo(cell.value.snp.top)
        make.left.equalTo(20)
        make.trailing.equalTo(cell.value.snp.leading)
    
    cell.value.snp.makeConstraints  (make) in
        make.right.equalTo(-20)
        make.top.equalTo(cell.title.snp.top)
        make.bottom.equalTo(-10)
    

    NSLog("value height is: \(cell.value.frame.height)")
    NSLog("cell height is: \(cell.frame.height)")
        return cell;
        

自定义单元类:

// MARK: custom cell
class CustomCell: UITableViewCell 

// MARK: Property
static var customCell = "cell"
public var title:UILabel = 
    let tit = UILabel()
    tit.setContentHuggingPriority(.defaultLow, for: .horizontal)
    tit.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
    tit.textColor = .black
    tit.alpha = 0.6
    return tit
()
public var value:UILabel = 
    let val = UILabel()
    val.textColor = .black
    val.setContentHuggingPriority(.defaultHigh, for: .horizontal)
    val.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
    val.lineBreakMode = NSLineBreakMode.byWordWrapping
    val.numberOfLines = 0
    val.alpha = 0.75
    return val
()

// MARK: initializer
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) 
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    self.addSubview(title)
        self.addSubview(value)


    required init?(coder aDecoder: NSCoder) 
        fatalError("init?(coder aDecoder: NSCoder)")
    

这是控制台日志:

snapkitTest[26345:1387159] 单元格高度为:44.0 snapkitTest[26345:1387159] 值高度为:0.0

【问题讨论】:

【参考方案1】:

1-您必须将标签添加到

self.contentView.addSubview(title)

2- 你需要为 contentView 设置底部约束

title.snp.makeConstraints  (make) -> Void in
        make.trailing.equalTo(value.snp.leading)
        make.top.equalTo(self.contentView.snp.top).inset(10)
        make.left.equalTo(20)
    
value.snp.makeConstraints  (make) -> Void in
        make.right.equalTo(-40)
        make.top.equalTo(self.contentView.snp.top).inset(10)
        make.bottom.equalTo(-10)
    

还要将此约束转移到单元格自定义类的init中,以免每次滚动tableView都重新添加约束

【讨论】:

以上是关于SnapKit - UITableView 高度不随单元格的动态内容而变化的主要内容,如果未能解决你的问题,请参考以下文章

SnapKit swift实现高度自适应的新浪微博布局

SnapKit 和 Dynamic UITableViewCell 布局不正确

更新约束不适用于 UITableView snapkit

如何在 SnapKit 中按值增加视图高度?

我想使用 SnapKit 将顶部 UIView 放置在 UITableView 之上

UITableView HeaderView,FooterView 使用SnapKit布局导致约束异常