Можно ли получить высоту заголовка раздела динамического представления таблицы с помощью автоматического макета?
Новое в iOS 8, вы можете получить 100% динамические ячейки таблицы таблиц, просто установив примерную высоту строки, а затем разместите свои элементы в ячейке с помощью автоматического макета. Если содержание увеличивается по высоте, ячейка также будет увеличиваться по высоте. Это очень полезно, и мне интересно, можно ли сделать такой же подвиг для заголовков разделов в виде таблицы?
Можно создать, например, UIView
в tableView:viewForHeaderInSection:
, добавить подтекст UILabel
, задать ограничения макета для метки для представления и увеличить высоту представления, чтобы соответствовать содержимому этикетки, без необходимости выполнять tableView:heightForHeaderInSection:
?
В документации для viewForHeaderInSection
указано: "Этот метод работает корректно только тогда, когда tableView: heightForHeaderInSection: также реализуется". Я не слышал, если что-то изменилось для iOS 8.
Если вы не можете этого сделать, как лучше всего имитировать это поведение?
Ответы
Ответ 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
В моем случае:
- установить программно, не работать.
self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension
.
-
установить в раскадровке не работать.
-
переопределить 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 для меня