我有stackview。我试图插入一个TableView作为其安排的子视图之一。我希望我的tableview高度在其子单元格数量的函数中是自动的。经过大量研究,尤其是在StackOverflow中的答案之后,我发现当表视图布局子视图时,必须“取消验证”表视图的“ intrinsicContentSize”。虽然,这仍然行不通:
这是我的tableview类:
class TableView : UITableView {
override var intrinsicContentSize: CGSize {
get {
(BP1) return CGSize(width: CGFloat.greatestFiniteMagnitude, height: contentSize.height)
}
}
override func layoutSubviews() {
super.layoutSubviews()
//(***)
(BP2) invalidateIntrinsicContentSize()
}
}
但是,问题是当我运行应用程序时,tableView的高度为44 * numberOfRow(44似乎是UITableView的默认高度)。不考虑contentSize.height。
我试图在(BP)处放置断点(在上面的代码上):在2个函数中出现几次之后,程序最终转到(BP1),在这里具有正确的contentSize.height,将其设置为internalContentSize ,然后转到layoutSubview(BreakPoint 2)。
问题在于,此刻,即使internalContentSize正位于layoutSubview的入口处,我的tableview.frame.height
仍为BP2的44 * numberrow(在super.layoutSubviews()
之后)< / strong>。我只是在super.layoutSubviews()
考虑到刚设置为正确值的新internalContentSize,并随后将tableView.frame.height更新为该值。
最后,我要做的是将该行放在(***):
frame = CGRect(x:frame.origin.x, y: frame.origin.y, width:10000, height: contentSize.height)
使用此功能,它将帧更新为正确的值。尽管我不明白为什么在super.layoutSubviews()
的自动布局过程中未考虑正确的内在contentSize。