这些解决方案都不适合我。这是我对Swift 4和Xcode 10.1所做的...
在viewDidLoad()中,声明表动态行高并在单元格中创建正确的约束...
tableView.rowHeight = UITableView.automaticDimension
同样在viewDidLoad()中,将所有tableView单元格笔尖注册到tableview,如下所示:
tableView.register(UINib(nibName: "YourTableViewCell", bundle: nil), forCellReuseIdentifier: "YourTableViewCell")
tableView.register(UINib(nibName: "YourSecondTableViewCell", bundle: nil), forCellReuseIdentifier: "YourSecondTableViewCell")
tableView.register(UINib(nibName: "YourThirdTableViewCell", bundle: nil), forCellReuseIdentifier: "YourThirdTableViewCell")
在tableView heightForRowAt中,返回高度等于indexPath.row上每个单元格的高度...
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.row == 0 {
let cell = Bundle.main.loadNibNamed("YourTableViewCell", owner: self, options: nil)?.first as! YourTableViewCell
return cell.layer.frame.height
} else if indexPath.row == 1 {
let cell = Bundle.main.loadNibNamed("YourSecondTableViewCell", owner: self, options: nil)?.first as! YourSecondTableViewCell
return cell.layer.frame.height
} else {
let cell = Bundle.main.loadNibNamed("YourThirdTableViewCell", owner: self, options: nil)?.first as! YourThirdTableViewCell
return cell.layer.frame.height
}
}
现在,为tableView的每个单元格提供一个估计的行高,estimateHeightForRowAt。尽可能准确...
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.row == 0 {
return 400 // or whatever YourTableViewCell's height is
} else if indexPath.row == 1 {
return 231 // or whatever YourSecondTableViewCell's height is
} else {
return 216 // or whatever YourThirdTableViewCell's height is
}
}
那应该工作...
调用tableView.reloadData()时不需要保存和设置contentOffset
reloadRowsAtIndexPaths
。但是(2)“跳跃”是什么意思,(3)是否设置了估计的行高?(只是想弄清楚是否有更好的解决方案,可以让您动态更新表格。)