3 回答

TA貢獻2065條經(jīng)驗 獲得超14個贊
實際上,我自己找到了答案。
我只是創(chuàng)建一個新CGRect的tableView.frame用height的table.contentSize.height
這臺的高度UITableView到height它的內(nèi)容。由于代碼修改了UI,因此請不要忘記在主線程中運行它:
dispatch_async(dispatch_get_main_queue(), ^{
//This code will run in the main thread:
CGRect frame = self.tableView.frame;
frame.size.height = self.tableView.contentSize.height;
self.tableView.frame = frame;
});

TA貢獻1772條經(jīng)驗 獲得超6個贊
無需KVO,DispatchQueue或自行設(shè)置約束的Swift 5和4.2解決方案。
該解決方案基于Gulz的答案。
1)創(chuàng)建以下子類UITableView:
import UIKit
final class ContentSizedTableView: UITableView {
override var contentSize:CGSize {
didSet {
invalidateIntrinsicContentSize()
}
}
override var intrinsicContentSize: CGSize {
layoutIfNeeded()
return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height)
}
}
2)UITableView在布局中添加一個,并在所有側(cè)面設(shè)置約束。將其類別設(shè)置為ContentSizedTableView。
3)您應(yīng)該看到一些錯誤,因為Storyboard并未考慮我們的子類intrinsicContentSize。通過打開大小檢查器并將internalContentSize重寫為占位符值來解決此問題。這是設(shè)計時間的替代。在運行時,它將在ContentSizedTableView類中使用重寫
更新:更改了Swift 4.2的代碼。如果您使用的是早期版本,請使用UIViewNoIntrinsicMetric代替UIView.noIntrinsicMetric

TA貢獻1802條經(jīng)驗 獲得超10個贊
快速解決方案
跟著這些步驟:
1-在情節(jié)提要中設(shè)置表格的高度限制。
2-從情節(jié)提要中拖動高度約束,并在視圖控制器文件中為其創(chuàng)建@IBOutlet。
@IBOutlet weak var tableHeight: NSLayoutConstraint!
3-然后您可以使用以下代碼動態(tài)更改桌子的高度:
override func viewWillLayoutSubviews() {
super.updateViewConstraints()
self.tableHeight?.constant = self.table.contentSize.height
}
更新資料
如果為您剪切了最后一行,請嘗試在willDisplay單元格函數(shù)中調(diào)用viewWillLayoutSubviews():
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
self.viewWillLayoutSubviews()
}
- 3 回答
- 0 關(guān)注
- 866 瀏覽
添加回答
舉報