TableView пропускается при смещении ячеек сечения - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь реализовать систему свертывания / развертывания для секций табличного представления.Когда пользователь нажал на заголовок раздела, он вставит ячейки в раздел, если еще раз нажать на тот же заголовок раздела, затем удалит ячейки из раздела, создав эффект «свертывания».

Проблема заключается в том, что я пытаюсь развернуть более 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
}
...