Размер содержимого UViewableViewHeaderFooterView неожиданно изменяется при выборе строки - PullRequest
0 голосов
/ 24 января 2019

У меня проблема с заголовками разделов в UITableView, которые меняют размер при выборе строки, заставляя разделы таблицы прыгать, когда вы нажимаете на строку.

Приложение использует собственный шрифт с динамическим размером.Я устанавливаю шрифт с помощью

UIFontMetrics(forTextStyle: <textStyle>).scaledFont(for: <font>, maximumPointSize: <maximumPointSize>)

У меня есть способ обойти проблему с настройкой по умолчанию, но проблема возвращается с большими размерами шрифта доступности.

Таблица состоит из двух разделов.В заголовках разделов используется стандартный компонент.Первый раздел (который обычно содержит три ячейки) использует стандартный UITableViewCell.Во втором разделе есть одна настраиваемая ячейка, которая при выборе вставляет вторую настраиваемую ячейку со средством выбора (см. Способ, которым ячейка времени начала открывает средство выбора даты в приложении Календарь iOS).Дополнительная ячейка вставляется с использованием блока beginUpdates / endUpdates с insertRows.

Вот что происходит: когда таблица впервые отображается, заголовок contentView намного больше, чем UILabel с заголовком.Если я коснусь ячейки в разделе 2, которая открывает вторую ячейку, размер заголовка contentView будет уменьшен, чтобы соответствовать размеру метки.Так и останется, если я не выберу одну из ячеек в первом разделе.В этот момент заголовки снова изменяются, теперь с размером содержимого меньше исходного, но больше, чем было наименьшим.

Вот что я попробовал:

Первоначально я указал размер шрифта заголовка таблицы, используя

UILabel.appearance(whenContainedInInstancesOf: [UITableViewHeaderFooterView.self])

в AppDelegate, где я имею дело с другими типамикомпонентов.Однако, похоже, что UITableView не систематически наблюдает это при перезагрузке данных таблицы, то есть сам размер шрифта будет изменяться во время перезагрузки таблицы (не только размер contentView).

Я изменил код, чтобы вместо него указать размер шрифта в willDisplayHeaderView, то есть что-то вроде этого:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

        if let header = view as? UITableViewHeaderFooterView {
            if let textlabel = header.textLabel {
                textlabel.font = UIFontMetrics(forTextStyle: .body).scaledFont(for:Theme.font, maximumPointSize: 30)
            }
            if section == 0 {
              header.accessibilityLabel = ...
              header.accessibilityHint = ...
            } else {
              header.accessibilityLabel = ... 
              header.accessibilityHint = ... 
            }

Это избавило от проблемы с изменением размера шрифта при перерисовке таблицы.Это также избавило от проблемы с изменением размера contentView заголовка для размера шрифта по умолчанию.Но как только я переключаю размер шрифта в настройках специальных возможностей, появляется проблема изменения размера заголовка contentView.

Я попытался установить sectionHeaderHeight («settings» - это UITableView)

self.settings.sectionHeaderHeight = UITableView.automaticDimension
self.settings.estimatedSectionHeaderHeight = 60

Это тоже не имеет значения.

Если бы я догадался, похоже, что заголовок иногда изменяет свой размер, основываясь на отображении гораздо большего UILabel, но почему размеры отличаются в зависимости от того, как таблицаredrawn?

Полагаю, следующим шагом будет замена заголовка таблицы на пользовательское представление, но это кажется излишним.

Чего мне не хватает?

...