Я создал расширяемый класс UITableViewCell, который модифицирует константу для достижения эффекта.Расширяемый TableViewCells - повторное использование ячеек вызывает
import UIKit
class ExpandableCell: UITableViewCell {
@IBOutlet weak var img: UIImageView!
@IBOutlet weak var imgHeightConstraint: NSLayoutConstraint!
var isExpanded:Bool = false
{
didSet
{
if !isExpanded {
self.imgHeightConstraint.constant = 0.0
} else {
self.imgHeightConstraint.constant = 128.0
}
}
}
}
View Controller
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 21
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell:ExpandableCell = tableView.dequeueReusableCell(withIdentifier: "ExpandableCell") as! ExpandableCell
cell.img.image = UIImage(named: imgs[indexPath.row])
cell.isExpanded = false
return cell
}
// TableView Delegate methods
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print(indexPath.row)
guard let cell = tableView.cellForRow(at: indexPath) as? ExpandableCell
else { return }
UIView.animate(withDuration: 0.3, animations: {
let offset: CGPoint = self.tableView.contentOffset
tableView.beginUpdates()
cell.isExpanded = !cell.isExpanded
self.tableView.layer.removeAllAnimations()
self.tableView.setContentOffset(offset, animated: false)
tableView.scrollToRow(at: indexPath, at: UITableViewScrollPosition.top, animated: true)
tableView.endUpdates()
})
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
guard let cell = tableView.cellForRow(at: indexPath) as? ExpandableCell
else { return }
UIView.animate(withDuration: 0.3, animations: {
tableView.beginUpdates()
cell.isExpanded = false
tableView.endUpdates()
})
}
Все отлично работает для нескольких первых строк, после прокрутки вниз, клетки не ведут себя должным образом, кажется, что она прокручивается в верхней части, то пропадает изображение.
Я знаю, что это может иметь какое-то отношение к тому, чтобы не хранить значение boolean isExpanded
в каком-то массиве, чтобы отслеживать его, но, тем не менее, я думаю, что это неправильно с обновлением TableView.
EDIT
Sulthan ответ помог мне много, но проблема с прокруткой к вершине, особенно при касании самые низкие клетки продолжает упорно.
Пробовал этот UITableView scrolls to top when reloading cells with changing cell heights
с estimatedRowHeight до ближайшего значения, но это не решает мою проблему в случае вспененных клеток.
У кого-нибудь есть идея, как его исправить?
Клетки повторно. Вы должны сохранить 'isExpanded' вне своих представлений, в свою модель. Например. создайте 'Set' с расширенными строками. – Sulthan
создайте модель ячейки (struct или class) для каждой ячейки таблицы и сохраните имя изображения, и если она будет расширена в этой модели, а затем в массиве. то он находится в одном месте. – muescha