Я пытаюсь реализовать систему свертывания / развертывания для секций табличного представления.Когда пользователь нажал на заголовок раздела, он вставит ячейки в раздел, если еще раз нажать на тот же заголовок раздела, затем удалит ячейки из раздела, создав эффект «свертывания».
Проблема заключается в том, что я пытаюсь развернуть более 2 разделов, начиная снизу.Нажатие на раздел, в котором по крайней мере одна ячейка сдвигает весь контент без анимации в нижнюю позицию раздела.
Я использую автоматическое размещение из кода и RxDataSource.
Вот как я связываю источник данных:
let dataSourceForPurchasersList = RxTableViewSectionedAnimatedDataSource<AnimatableSectionModel<ExpandableSectionModel, CustomerCellModel>>(configureCell: { (dataSource, tableView, indexPath, cellModel) -> UITableViewCell in
let cell = tableView.dequeueReusableCell(withIdentifier: GuestTableViewCell.reuseIdentifier, for: indexPath) as? GuestTableViewCell
cell?.setupCell(model: cellModel)
return cell ?? UITableViewCell()
})
viewModel.dataSourceBehaviorPurchasersList
.bind(to: self.ordersTableView.rx.items(dataSource: dataSourceForPurchasersList))
.disposed(by: self.disposeBag)
Вот как я управляю расширением раздела:
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
guard let viewModel = self.viewModel else { return nil }
let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: CustomersSectionHeader.reuseIdentifier) as? CustomersSectionHeader
...
guard let models = try? modelsBehavior.value() else { return nil }
let dataSourceSectionModel = models[section]
header?.configView(model: dataSourceSectionModel)
header?.tapClosure = { [weak modelsBehavior, weak header] in
dataSourceSectionModel.expanded = !dataSourceSectionModel.expanded
header?.updateSelectorImageView()
modelsBehavior?.onNext(models)
}
return header
}
Представление проблемы
@ edit
Решение:
Я заметил, что смещение содержимого равно высоте заголовка раздела, благодаря реализации функции scrollViewDidScroll(_ scrollView: UIScrollView)
, и это зависит от внутренней логики табличного представления.Я установил headerHeight и оценкаHeight заголовка раздела равным значению, после чего я использовал этот код:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let divValue: CGFloat
if self.guestsTableView.delegate === scrollView.delegate {
divValue = self.guestsTableView.estimatedSectionHeaderHeight
} else {
divValue = self.ordersTableView.estimatedSectionHeaderHeight
}
let diff = abs(self.scrollViewOffsetLastY - scrollView.contentOffset.y)
let rest = diff.truncatingRemainder(dividingBy: divValue)
if rest == 0 {
scrollView.contentOffset.y = self.scrollViewOffsetLastY
}
self.scrollViewOffsetLastY = scrollView.contentOffset.y
}