UITableView设置行高无效



为什么当我在viewDidLoad()中设置tableView.rowHeight = 100时,我总是得到默认高度值44.0?我也试着设置tableView.estimatedHeight =100,但没有运气,我也试着设置委托方法tableView.heightForRowAt,但似乎没有任何效果。问题是,如何设置tableviewcell的高度?

override func viewDidLoad(){ // tableView viewDidLoad
super.viewDidLoad()
tableView.rowHeight = 100
tableView.register(TickerCell.self, forCellReuseIdentifier: "Cell")
}
// Custom Cell Init 
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
backgroundColor = .clear
print(frame.height) // always prints 44.0
let symbolstack = UIStackView(arrangedSubviews: [symbolLabel,companyLabel])
let sectorstack = UIStackView(arrangedSubviews: [sectorLabel,exchangeLabel])
let mainStack = UIStackView(arrangedSubviews: [symbolstack,sectorstack])
sectorstack.axis = .vertical
symbolstack.axis = .vertical
sectorstack.alignment = .trailing
symbolstack.alignment = .leading
symbolstack.distribution = .fillEqually
sectorstack.distribution = .fillEqually
mainStack.distribution = .fillProportionally
addSubview(mainStack)
mainStack.translatesAutoresizingMaskIntoConstraints = false
mainStack.heightAnchor.constraint(equalTo: self.heightAnchor).isActive = true
mainStack.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -45).isActive = true
mainStack.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 15).isActive = true
addSubview(WatchlistStar)
WatchlistStar.translatesAutoresizingMaskIntoConstraints = false
WatchlistStar.widthAnchor.constraint(equalToConstant: 15).isActive = true
WatchlistStar.leadingAnchor.constraint(equalTo: mainStack.trailingAnchor, constant: 20).isActive = true
WatchlistStar.heightAnchor.constraint(equalToConstant: 15).isActive = true
WatchlistStar.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
}

所以问题似乎是在事实,然后在单元格初始化方法rowHeight我设置在viewDidLoad似乎没有注册,只有在prepareForReuse当我打印frame.height我得到100打印,所以在哪种方法中我设置单元格布局?

一个单元格不是生来就知道它的高度,所以init是一个毫无意义的地方去看框架。事实上,它没有固有的高度。细胞被重复使用。它们的高度仅与表中正在使用它们的某一行有关。当单元格在不同的行中使用时,该高度可以改变(因为行可以是不同的高度)。所以你的布局需要处理这个

在您所展示的代码中,您正在使用自动布局。自动布局的关键在于,你在任何时候都不关心事物的框架。随着周围帧的变化,一切都会自动调整。自动布局是关于关系的

所以在这种情况下的解决方案是:不要frame.height。你不需要知道。只要布局视图和单元格之间的关系,当单元格出现时,如果您正确地使用了自动布局,一切都会正确。

另一方面,正如你现在在注释中所说的"我被迫[使用自动布局]不是因为我想"-好的,所以如果目标是手动做布局,就像我们之前做的自动布局,那么在数据源的cellForRowAt:中做它。或者您可以尝试在单元格的layoutSubviews中这样做,如果您希望单元格布局自己。请参阅我的书的旧版本,在线,了解我们过去是如何做到这一点的:http://www.apeth.com/iOSBook/ch21.html#_custom_cells

要非常小心地区分添加子视图和调整它们的大小。您不希望犯添加已经添加的子视图的错误。所以在init中添加子视图,当然,因为它只被调用一次,但是在行的实际大小已经传达给单元格的地方设置它们的大小。

还有一个建议。您当前的代码使用短语addSubview,表示self.addSubview。这是完全错误和非法的。永远不要直接向单元格添加子视图。将其添加到单元格的contentView中,并根据其大小设置。

override func viewDidLoad() {
super.viewDidLoad()
self.tableView.rowHeight = UITableView.automaticDimension;
self.tableView.estimatedRowHeight = 40 
}

最新更新