Ошибка 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)
}
}