iOS 11 плавающий заголовок TableView

Приложение, состоящее из нескольких разделов, по несколько строк на раздел, когда "развернуто", и ни одного, когда "свернуто". Каждый раздел имеет заголовок раздела, повторно использовал их, используя подкласс UITableViewHeaderFooterView и т.д. Пока все хорошо.

Тогда в iOS 11:

Снимок экрана, описывающий проблему

Я использовал визуальный отладчик и подтвердил, что заголовок моего раздела плавающий. Все строки под заголовком отображаются правильно, остальные заголовки отображаются нормально.

Стремясь восстановить здравомыслие, я отбросил всю логику повторного использования для заголовка и просто сделал это программно. То же самое Все работают до iOS 11, все еще плавают в iOS 11. Кажется, что плавающий раздел меняется каждый раз, так что есть что.

Есть идеи?

5 ответов

Просто столкнулся с подобной проблемой и нашел обсуждение по этой проблеме, которое работало для меня:

self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;

Похоже, поведение по умолчанию UITableView изменено в iOS 11, чтобы использовать предполагаемые высоты. В заметках о выпуске iOS 11 beta 2 говорится:

Табличные представления теперь используют оценочные высоты по умолчанию, что также означает, что ячейки и представления верхнего / нижнего колонтитула раздела теперь по умолчанию имеют собственный размер. Значением по умолчанию для значений свойств valuesRowHeight, оценка SectionHeaderHeight и оценка SectionFooterHeight теперь является UITableViewAutomaticDimension, что означает, что табличное представление выбирает предполагаемую высоту для использования. Вы все равно должны предоставить более точную оценку для каждого свойства, если это возможно, что является вашим лучшим предположением о среднем значении фактических высот. Если у вас есть существующий код табличного представления, который ведет себя по-разному при создании приложения с помощью iOS 11 SDK, и вы не хотите применять самоконтроль, вы можете восстановить предыдущее поведение, отключив расчетную высоту, установив значение ноль для Каждое оценочное свойство высоты. (30197915)

см. также примечания к выпуску бета 2, отраженные здесь.

Если вы хотите внести изменения, как в ответе Ахмедре для всего приложения, вы можете установить эти свойства в AppDelegate didFinishLaunchingWithOptions

UITableView.appearance().estimatedRowHeight = 0;
UITableView.appearance().estimatedSectionHeaderHeight = 0;
UITableView.appearance().estimatedSectionFooterHeight = 0

Я не знаю, почему в моем случае ответ @ahmedre не работает...

Так что мой ответ может помочь вам, если вы установите все оценочные свойства в 0, также не работающие:

func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat {
    return 0.1
}

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 0.1
}

Попробуйте изменить стиль таблицы с простого на сгруппированный.

Добавили ли вы заголовок из раскадровки, если да, поделитесь снимком экрана "заголовки таблицы в раскадровке"
Также вы рассчитываете высоту строки? расчеты соответствуют ожиданиям?

Другие вопросы по тегам