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


новое в iOS 8 вы можете получить 100% динамические ячейки таблицы, просто установив предполагаемую высоту строки, а затем расположите свои элементы в ячейке с помощью автоматической компоновки. Если содержание увеличивается в высоту, ячейка также будет увеличиваться в высоту. Это чрезвычайно полезно, и мне интересно, может ли тот же подвиг быть выполнен для заголовков разделов в табличном представлении?

можно ли, например, создать UIView на tableView:viewForHeaderInSection: добавьте UILabel subview, укажите ограничения автоматической компоновки для метка против представления и увеличение высоты представления, чтобы соответствовать содержимому метки, без необходимости реализации tableView:heightForHeaderInSection:?

документация viewForHeaderInSection заявляет: "Этот метод работает только правильно, когда tableView: heightForHeaderInSection: также реализован."Я не слышал, изменилось ли что-нибудь для iOS 8.

если вы не можете этого сделать, каков наилучший способ имитировать это поведение?

6 77

6 ответов:

это возможно. Он является новым прямо рядом с динамическими высотами ячеек, реализованными в iOS 8.

это очень просто. Просто добавьте это в viewDidLoad:

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 25;

затем переопределить viewForHeaderInSection и использовать автоматическую компоновку, чтобы ограничить элементы в вашем представлении, как показано на рисунке. Вот так! Не нужно реализовывать heightForHeaderInSection. И на самом деле sectionHeaderHeight не нужно также заявлять, Я просто добавил его для ясности.

обратите внимание, что в iOS 11 ячейки и представления верхнего / нижнего колонтитула используют оценочные высота по умолчанию. Единственное, что нужно сделать, это предоставить расчетную высоту, чтобы лучше информировать систему, чего ожидать. Значение по умолчанию:UITableViewAutomaticDimension но вы должны предоставить лучшую оценку, что это средняя высота они будут, если это возможно.

Это может быть достигнуто путем установки (или возврата)estimatedSectionHeaderHeight на вашем представлении таблицы.

если ваш заголовок раздела перекрывает ваши ячейки после установки estimatedSectionHeaderHeight убедитесь, что вы используете estimatedRowHeight Как хорошо.

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

пробовал

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 25;

но это не правильно размер заголовка с многострочной надписи. Добавил Это, чтобы решить мою проблему:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Recalculates height
    tableView.beginUpdates()
    tableView.endUpdates()
}

Я изменил iuriimozответ. Только что заменил метод viewWillAppear:

tableView.sectionHeaderHeight = UITableViewAutomaticDimension
tableView.estimatedSectionHeaderHeight = 25


override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Recalculates height
    tableView.layoutIfNeeded() 
}

также добавьте tableView.layoutIfNeeded () to

override func viewDidAppear(_ animated: Bool) {

    super.viewDidAppear(animated)
    tableView.layoutIfNeeded()
}

для iOS 10

tableView.beginUpdates()
tableView.endUpdates()

есть" исчезают " эффект анимации на viewWillAppear для меня

Да, это работает для меня. Я должен сделать больше изменений, как показано ниже:

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let label = UILabel()

    label.numberOfLines = 0
    label.text          = my own text

    return label
}

В моем случае:

  1. установить программно не работает.

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension.

  1. набор в раскадровке не работает.

  2. переопределить heightForHeaderInSectionработала.

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

испытательные среды:

  • Mac OS 10.13.4
  • XCode Версии 9.4.1
  • симулятор iPhone 8 Плюс