Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

Я пробовал

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

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

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

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

Ответ 4

Застрял в той же проблеме, где заголовок получал нулевую высоту до тех пор, пока я не предоставлю фиксированную высоту в heighForHeaderInSection для heighForHeaderInSection.

Перепробовал много решений, которое включает

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 73'

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

self.tableView.estimatedRowHeight = 135
self.tableView.rowHeight = UITableViewAutomaticDimension'

Исправление очень простое и странное, но я должен был реализовать методы делегата вместо 1-строчного кода для estimatedSectionHeaderHeight sectionHeaderHeight и sectionHeaderHeight что в моем случае выглядит следующим образом.

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

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

Ответ 5

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

  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 Plus

Ответ 6

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

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

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

    return label
}

Ответ 7

Свифт 4+

работает (проверено 100%)

Если вам нужен как раздел, так и строка с динамической высотой, основанной на содержимом, вы можете использовать следующий код:

На viewDidLoad() напишите эти строки:

    self.globalTableView.estimatedRowHeight = 20
    self.globalTableView.rowHeight = UITableView.automaticDimension

    self.globalTableView.sectionHeaderHeight =  UITableView.automaticDimension
    self.globalTableView.estimatedSectionHeaderHeight = 25;

Теперь мы установили высоту строки и высоту раздела с помощью методов делегата UITableView:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
   {
       return UITableView.automaticDimension
   }
   func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

       return UITableView.automaticDimension

   }

Ответ 8

Я модифицировал иуриимоз ответа. Просто заменил метод viewWillAppear:

tableView.sectionHeaderHeight = UITableViewAutomaticDimension
tableView.estimatedSectionHeaderHeight = 25


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

    // Recalculates height
    tableView.layoutIfNeeded() 
}

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

override func viewDidAppear(_ animated: Bool) {

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

Для iOS 10

tableView.beginUpdates()
tableView.endUpdates()

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