Tidak ada solusi yang berhasil untuk saya. Inilah yang saya lakukan dengan Swift 4 & Xcode 10.1 ...
Di viewDidLoad (), deklarasikan tinggi baris dinamis tabel dan buat batasan yang benar dalam sel ...
tableView.rowHeight = UITableView.automaticDimension
Juga di viewDidLoad (), daftarkan semua nibs sel tableView Anda ke tableview seperti ini:
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")
Di tableView heightForRowAt, kembalikan tinggi sama dengan tinggi setiap sel di 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
}
}
Sekarang berikan tinggi baris perkiraan untuk setiap sel di tableView estimasiHeightForRowAt. Jadilah seakurat mungkin ...
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
}
}
Itu seharusnya bekerja ...
Saya tidak perlu menyimpan dan mengatur contentOffset saat memanggil tableView.reloadData ()
reloadRowsAtIndexPaths
. Tetapi (2) apa yang Anda maksud dengan "gelisah" dan (3) sudahkah Anda menetapkan tinggi baris yang diperkirakan? (Hanya mencoba mencari tahu apakah ada solusi yang lebih baik yang akan memungkinkan Anda untuk memperbarui tabel secara dinamis.)