У меня есть UIViewController
, который содержит UITableView
(в отличие от использования UITableViewController
), и он делает что-то очень странное.
Когда я касаюсь ячейки, чтобы перейти к подробному экрану, когда я затем нажимаю кнопку «Назад», коснувшаяся ячейка (часто, но не всегда) находится дальше экрана, чем была, когда я касалась ее.Иногда это даже совершенно не видно.
Во время диагностики проблемы я заметил странную вещь, замедлив анимацию, возникающую при нажатии на ячейку.При переходе от экрана табличного представления к подробному экрану ячейка с касанием дублируется, а затем перемещается вверх.
Я взял середину перехода на снимке экрана.Вы можете видеть здесь, где я коснулся ячейки 4, она сразу дублирует себя и начинает подниматься к вершине, когда выходит из поля зрения.
После многих исследований, я думаю, проблема, скорее всего, связана с тем, что ячейки динамически изменяют размер самих себя (поскольку объем текстав каждом может варьироваться) и табличное представление пытается вычислить высоту ячейки.Я убедился:
- все подпредставления в ячейке имеют ограничения сверху, снизу и сбоку (для этого я даже удалил пару стековых представлений)
- Я установил
tableView.estimatedRowHeight = 160
- Я установил
tableView.rowHeight = UITableView.automaticDimension
Я не делаю ничего необычного в моих методах делегата tableview:
extension DocumentViewController: UITableViewDataSource, UITableViewDelegate {
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return viewModel.data.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "documentTableViewCell", for: indexPath) as! DocumentTableViewCell
cell.tag = indexPath.row
cell.updateCellProperties(publication: viewModel.data[indexPath.row], indexPathRow: indexPath.row)
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
performSegue(withIdentifier: showDocumentSegueIdentifier, sender: self)
}
}
и эточто происходит в cell.updateCellProperties
:
func updateCellProperties(document: DocumentModel, indexPathRow: Int) {
selectedBackgroundView?.backgroundColor = UIColor.clear
authorName.text = document.formattedAuthor.name
authorInitials.text = document.formattedAuthor.initials
documentTitle.text = document.title
setAuthorImage(document, indexPathRow: indexPathRow)
setDocTypeBadge(document: document, indexPathRow: indexPathRow)
unreadCommentCount.text = ""
// set read/unread style
var alphaValue = CGFloat(1.0)
if let isRead = document.isRead {
if isRead {
contentView.backgroundColor = UIColor.white
alphaValue = CGFloat(0.5)
} else {
contentView.backgroundColor = UIColor.lightGrey3
}
authorName.alpha = alphaValue
authorInitials.alpha = alphaValue
authorImage.alpha = alphaValue
documentTitle.alpha = alphaValue
unreadCommentCount.alpha = alphaValue
docTypeBadge.alpha = alphaValue
}
}
, и в prepare(for segue:)
:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let path = tableView.indexPathForSelectedRow
if (segue.identifier == showDocumentSegueIdentifier) {
let controller = segue.destination as! DocumentViewController
controller.hidesBottomBarWhenPushed = true
}
}
вообще ничего интересного не происходит, я чувствую, что все сделал правильно, но это странноповедение не уйдетУ вас есть какие-либо предложения, которые я могу попробовать?
Спасибо