#swift #uitableview #scrolltorow
#быстрый #uitableview #прокрутка
Вопрос:
У меня странная проблема, когда scrollToRow
UITableView
я не занимаю правильную позицию.
У меня есть UITableView, где у меня есть разделы и строки. В разделах я показываю категории, а в строках я показываю товары для этих категорий. laundryCategoriesList
есть список категорий, и для каждой категории у меня есть список продуктов в виде списка вложенных массивов внутри модели категорий.
Ниже приведен код, который у меня есть.
laundryItemsTV.sectionHeaderHeight = UITableView.automaticDimension laundryItemsTV.estimatedSectionHeaderHeight = screenHeight laundryItemsTV.rowHeight = UITableView.automaticDimension laundryItemsTV.estimatedRowHeight = screenHeight func numberOfSections(in tableView: UITableView) -gt; Int { return laundryCategoriesList.count } func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -gt; UIView? { let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: laundryCategoryHeader) as! LaundryCategoryHeader headerView.setUpView(categoryObject: laundryCategoriesList[section]) headerView.setNeedsLayout() headerView.layoutIfNeeded() return headerView } func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -gt; CGFloat { return screenHeight } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -gt; Int { return laundryCategoriesList[section].products.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -gt; UITableViewCell { guard let cell = tableView.dequeueReusableCell(withIdentifier: laundryProductCell, for: indexPath) as? LaundryProductCell else { return UITableViewCell() } cell.setUpView(productObject: laundryCategoriesList[indexPath.section].products[indexPath.row]) cell.setNeedsLayout() cell.layoutIfNeeded() cell.selectionStyle = .none cell.backgroundColor = .clear cell.contentView.backgroundColor = .clear return cell }
Над таблицей у меня есть UICollectionView
UITableView
представление, в котором я показываю категории, используя тот же список массивов laundryCategoriesList
. При нажатии на эту категорию мне просто нужно указать конкретный раздел в этом UITableView
.
Итак, ниже приведен код, который у меня есть, когда я нажимаю на UICollectionView
.
self.laundryItemsTV.scrollToRow(at: IndexPath(row: 0, section: indexPath.row), at: .top, animated: true)
Теперь проблема в том, что, когда я нажимаю на категорию, прокрутка не происходит точно в разделе просмотра таблицы. Он идет вверх-вниз. Однако, если я прокручу весь UITableView
один раз, а затем выполню события щелчка в представлении коллекции категорий, все будет работать нормально.
Обратите внимание, что contentInset
у меня есть представление таблицы, как показано ниже (просто для отображения горизонтального списка категорий).
self.laundryItemsTV.contentInset = UIEdgeInsets(top: self.mainHeightForTopViews, left: 0, bottom: 0, right: 0)
Я также поместил событие щелчка UICollectionView
внутри DispatchQueue.main.asyncAfter(deadline: .now() 0.1) {
, но все равно прокрутка не в порядке.
Также обратите UITableView
внимание, что тип Grouped
Есть идеи, чего мне здесь не хватает или я делаю что-то не так?
Комментарии:
1. Я бы сказал, что проблема в том, что ваш UITableView рассчитал размеры макета. Поэтому при прокрутке он пытается прокрутить его, но при расчете макета это неправильное положение. Если бы вы могли избежать слишком большого количества автоматических размеров, это было бы здорово. Для того, чтобы вместо заголовка был один? Разве это не «исправить»? Если вы используете фиксированную высоту (для заголовка и ячеек), это должно сработать, например. Просто попробуйте для тестирования.