Ошибка IOS 11 UITableView

Ошибка может быть воспроизведена с помощью repo здесь.

У меня странная ошибка, влияющая на мой проект в iOS 11 в UITableView. Представленный TableView сгруппирован, имеет расширяемые ячейки.

Появляется много странных эффектов, которые не появляются на моей ветке iOS 10:

  • Заголовки налагаются
  • странные проблемы телепортации, когда размер содержимого превышает размер контейнера UITableView, когда происходит сбой клеток.
  • Непосредственный телепорт в начало таблицы в начале прокрутки, когда размер содержимого превышает размер контейнера.
  • Ячейки ячейки неправильны (довольно часто)

Существует также билет, который, как представляется, связан на форуме разработчиков Apple здесь.

Я старался без успеха:

if #available(iOS 11.0, *) {
    tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentBehavior.never
}

Я пытаюсь найти поведение, которое изменилось в iOS 11, что может вызвать эту проблему.

Любая помощь будет оценена!

edit: Обрезание до границ помогло (но, в конце концов, оно скрывает/зажимает проблему). У меня все еще есть несколько вопросов (2, 3 и 4). Когда я пытаюсь развернуть ячейку, она телепортируется назад, а не плавно. Когда я разворачиваю ячейку и хочу прокручивать ее до нее плавно, она телепортируется вверх, а затем только прокручивает ее. (должен был добавить дополнительный раздел для показа).

Вот видео с проблемой (с помощью iPhone 7 Plus, iOS 11, Xcode 9 Golden Master): https://youtu.be/XfxcmmPdeoU

введите описание изображения здесь

Ответы

Ответ 1

В iOS 11 все оцененные свойства UITableView (estimatedRowHeight, estimatedSectionHeaderHeight и estimatedSectionFooterHeight) по умолчанию равны UITableViewAutomaticDimension.

Я вижу, что для ваших камер это прекрасно, когда вы возвращаете UITableViewAutomaticDimension в heightForRow. Однако для ваших заголовков и нижних колонтитулов вы не используете автоматическую калибровку. Я попытался бы отключить все поведение авторазмера в верхних колонтитулах, установив estimatedSectionHeaderHeight и estimatedSectionFooterHeight в 0.

Источник: iOS 11 Плавающий заголовок TableView

Ответ 2

Попробуйте этот workarround, предполагая, что ваши IBOutlets и переменные не являются конфиденциальными в StandardHeaderView.swift:

    func toggleSection(section: SectionType) {
    self.sectionsOpened[section] = !self.sectionsOpened[section]!

    let sectionIndex = self.sections.index(of: section)!

    let indexPath = IndexPath(row: 0, section: sectionIndex)

    UIView.animate(withDuration: 0.25) {
        self.tableView.reloadRows(at: [indexPath], with: .automatic)
        if let headerView = self.tableView.headerView(forSection: sectionIndex) as? StandardHeaderView {
            headerView.configWith(title: headerView.headerTitleLabel.text!, isOpen: self.sectionsOpened[section]!, selector: headerView.selector)
        }

        self.tableView.scrollToRow(at: IndexPath(row: 0, section: sectionIndex), at: .top, animated: true)
    }
}