Высота заголовка раздела отличается при ручной настройке - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь изменить высоту конкретного заголовка раздела в табличном представлении. Я проверил приведенный ниже код, чтобы понять, как работает tableView(_:heightForHeaderInSection:).

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    print("DEBUG : ", section, tableView.sectionHeaderHeight)
    return tableView.sectionHeaderHeight
}

Отладочная печать ниже показывает, что метод вызывается несколько раз, но высота заголовка всегда равна 18.0 (по умолчанию).

DEBUG :  4 18.0
DEBUG :  4 18.0
DEBUG :  0 18.0
DEBUG :  0 18.0
DEBUG :  1 18.0
DEBUG :  1 18.0
DEBUG :  2 18.0
...
DEBUG :  3 18.0

Теперь, как только я использую 18.0 в качестве фиксированного значения для возврата (для целей тестирования), вертикальное расширение табличного представления визуально сжимается, то есть секции располагаются ближе друг к другу, и поэтому весь пользовательский интерфейс выглядит иначе. Кажется, что пространство между разделами сокращено, поскольку заголовок первого раздела (по вертикали) виден только наполовину.

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    print("DEBUG : ", section, tableView.sectionHeaderHeight)
    return 18.0
}

Как это возможно?
Возможно ошибка?

--- ОБНОВЛЕНИЕ --- (13.06.2019)

Мой вопрос был основан на намерении скрыть раздел (2), включая заголовок. Я понял, что tableView.sectionHeaderHeight было неправильное свойство для использования. Я должен был использовать super.tableView(tableView, heightForHeaderInSection: section).

Приведенный ниже код работает как нужно:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if (section == 2) && myCondition {
        return CGFloat.leastNonzeroMagnitude
    }
    return super.tableView(tableView, heightForHeaderInSection: section)
}

Тем не менее, я не знаю, откуда взялся 18.0 (см. Выше), так как я не использую файлы .xib.

Кстати super.tableView(tableView, heightForHeaderInSection: section) всегда возвращает -1. Я считаю, что это заставляет iOS самостоятельно решать, какую высоту выбрать. Заданное вручную значение 18.0 (для тестирования) уменьшило заголовок, так как для iOS выбрано автоматическое значение высоты заголовка.

Я не нашел свойства для печати этого значения (должно быть около 30.0 - дикая догадка, ничего более).

1 Ответ

1 голос
/ 31 мая 2019

Согласно вашему коду,

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

Вы возвращаете sectionHeaderHeight как header height, что на самом деле означает UITableViewAutomaticDimension.

open var sectionHeaderHeight: CGFloat // по умолчанию UITableViewAutomaticDimension

Согласно Apple,

Это неотрицательное значение используется только в том случае, если делегат не реализует tableView: heightForHeaderInSection: метод.

Значение, которое вы получаете при использовании print("DEBUG : ", section, tableView.sectionHeaderHeight), т.е. 18.0 - это height из custom headerView в .xib.

Тем не менее, вы получаете правильный интерфейс, потому что iOS автоматически вычисляет header height внутри на runtime.

По этой причине ваш header сжимается, когда вы передаете 18.0 как header height вручную.

Если вы хотите использовать отдельные header height для каждого section, вам нужно передать этот manually в tableView(_:heightForHeaderInSection:) метод, то есть

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    switch section {
    case 0:
        return 50.0
    case 1:
        return 30.0
    default:
        return tableView.sectionHeaderHeight
    }
}

Вы можете добавить больше cases к вышеуказанному switch statement согласно вашему требованию. Дайте мне знать, если у вас все еще есть путаница по этому поводу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...