これらの解決策はどれも私にとってうまくいきませんでした。これがSwift 4とXcode 10.1で私がしたことです...
viewDidLoad()で、テーブルの動的行の高さを宣言し、セルに正しい制約を作成します...
tableView.rowHeight = UITableView.automaticDimension
また、viewDidLoad()で、次のようにすべてのtableViewセルnibを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見積もったHeightForRowAtで各セルの見積りの行の高さを指定します。できる限り正確に...
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)行の推定高さを設定しましたか?(テーブルを動的に更新できるより良い解決策があるかどうかを判断するだけです。)