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 和 Dynamic UITableViewCell 布局不正确