Почему UITableViewAutomaticDimension не работает?
Привет, есть много вопросов, отвечающих динамической высоте UITableViewCell
UITableView
. Однако я нахожу это странным, когда я это делал.
вот некоторые из ответов:
здесь и здесь
обычно это отвечает динамической высоте ячейки
tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableViewAutomaticDimension
но в моем случае я удивляюсь, что эта линия не сделает ничего.
мой UITableView
просматривается после нажатия на вкладке внутри splitview. Это полезно?
Может быть, я что-то упустил. Может ли кто-нибудь помочь мне, я провел 2 часа, делая глупо.
Это мое ограничение для названия, название может быть длинным, но ярлык - нет.
![enter image description here]()
и это моя ячейка
![enter image description here]()
Ответы
Ответ 1
Чтобы сделать работу UITableViewAutomaticDimension, вам нужно установить все ограничения слева, справа, внизу и сверху относительно представления контейнера ячеек. В вашем случае вам нужно будет добавить недостающее нижнее пространство для ограничения супервизора для метки под заголовком
Ответ 2
Я добавил программные ограничения и случайно добавил их в ячейку напрямую, т.е. не в свойстве contentView
. Добавление ограничений на contentView
разрешило это для меня!
Ответ 3
Чтобы установить автоматическое измерение высоты строки и оцененной высоты строки, выполните следующие шаги, чтобы сделать автоматическое измерение эффективным для макета высоты ячейки/строки.
- Присвоить и реализовать данные tableviewSource и делегировать
- Назначить
UITableViewAutomaticDimension
для rowHeight & оценкамRowHeight - Внедрите методы delegate/dataSource (например,
heightForRowAt
и верните значение UITableViewAutomaticDimension
)
-
Цель C:
// in ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
@property IBOutlet UITableView * table;
@end
// in ViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
self.table.dataSource = self;
self.table.delegate = self;
self.table.rowHeight = UITableViewAutomaticDimension;
self.table.estimatedRowHeight = UITableViewAutomaticDimension;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewAutomaticDimension;
}
Swift:
@IBOutlet weak var table: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Don't forget to set dataSource and delegate for table
table.dataSource = self
table.delegate = self
// Set automatic dimensions for row height
// Swift 4.2 onwards
table.rowHeight = UITableView.automaticDimension
table.estimatedRowHeight = UITableView.automaticDimension
// Swift 4.1 and below
table.rowHeight = UITableViewAutomaticDimension
table.estimatedRowHeight = UITableViewAutomaticDimension
}
// UITableViewAutomaticDimension calculates height of label contents/text
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
// Swift 4.2 onwards
return UITableView.automaticDimension
// Swift 4.1 and below
return UITableViewAutomaticDimension
}
Для экземпляра ярлыка в UITableviewCell
- Установить число строк = 0 (& режим разрыва строки = обрезать хвост)
- Задайте все ограничения (сверху, снизу, справа налево) относительно контейнера супервизора/ячейки.
- Необязательно: установите минимальную высоту для метки, если вы хотите, чтобы минимальная вертикальная область была покрыта меткой, даже если данных нет.
![enter image description here]()
Примечание. Если у вас несколько ярлыков (UIElements) с динамической длиной, которые должны быть скорректированы в соответствии с его размером содержимого: Отрегулируйте "Охват содержимого и приоритет сжатия" для меток, которые вы хотите расширить/сжать с более высоким приоритетом.
Ответ 4
Также убедитесь, что строки для вашего UILabel в ячейке установлены в 0. Если оно установлено в 1, оно не будет расти вертикально.
Ответ 5
У меня есть конкретный случай, и 99% прочитанных мной решений не сработали. Я думал, что поделюсь своим опытом. Надеюсь, что это поможет, поскольку я боролся за пару часов, прежде чем решить эту проблему.
Мой сценарий:
- Я использую два TableViews в одном ViewController
- Я загружаю Custom Cells (xib) в этих таблицах
- Динамический контент в ячейках состоит из двух меток
- Страница использует ScrollView
Чего мне нужно было достичь:
- Динамическая высота TableView
- Динамическая высота TableViewCells
Что нужно проверить, чтобы все работало гладко:
-
Как скажет вам каждый урок и ответ, установите все ограничения для вашего ярлыка/контента (верхний, нижний, ведущий и конечный) и установите для него ContentView (Superview). Этот видеоурок будет полезен.
-
В методе viewWillAppear
моего ViewController я даю одному из моих tableViews (tableView2
) приблизительную высоту строки, а затем использую UITableViewAutomaticDimension
как таковой (и как видно во всех уроках/ответах):
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tableView2.estimatedRowHeight = 80
tableView2.rowHeight = UITableViewAutomaticDimension
}
Для меня этих предыдущих шагов было недостаточно. Мой TableView просто возьмет оценочныйRowHeight и умножит его на количество ячеек. Meeeh.
-
Поскольку я использую два разных tableView, я создал выход для каждого из них, tableView1
и tableView2
. Позвольте мне изменить их размер в методе viewDidLayoutSubviews
. Не стесняйтесь спрашивать в комментариях, как я это сделал.
-
Один дополнительный шаг исправил это для меня, добавив это в метод viewDidAppear
:
override func viewDidAppear(_ animated: Bool) {
tableView1.reloadData() // reloading data for the first tableView serves another purpose, not exactly related to this question.
tableView2.setNeedsLayout()
tableView2.layoutIfNeeded()
tableView2.reloadData()
}
Надеюсь, что это помогает кому-то!
Ответ 6
Начиная с iOS 11 и Xcode 9.3, большая часть вышеуказанной информации неверна. Руководство Apple предлагает настройки
tableView.estimatedRowHeight = 85.0
tableView.rowHeight = UITableViewAutomaticDimension
Сессия 245 WWDC 2017 (Создание приложений с динамическим типом, около 16:33 в видео) предлагает нечто подобное. Ничто из этого не имело значения для меня.
Для ячейки стиля Субтитров все, что необходимо для получения ячеек представления таблицы с самоопределением размера, - это установить количество строк (в разделе "Метка" инспектора атрибутов) равным 0 как для Заголовка, так и для Субтитра. Если одна из этих меток слишком длинная, а количество строк не установлено на 0, ячейка табличного представления не будет корректировать свой размер.
Ответ 7
Забыл удалить tableView(heightForRowAt:indexPath:)
Это может быть так, что, как и я, вы случайно забыли удалить шаблонный код для метода heightForRowAt
.
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 60.0
}
Ответ 8
В моем случае у меня было два UITableViews, мне пришлось изменить этот метод как
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
CGFloat height = 0.0;
if (tableView == self.tableviewComments) {
return UITableViewAutomaticDimension;
}else if (tableView == self.tableViewFriends) {
height = 44.0;
}
return height;
}
Ответ 9
Попробуйте это, простое решение для меня,
В viewDidLoad напишите этот код,
-(void)viewDidLoad
{
[super viewDidLoad];
self.tableView.estimatedRowHeight = 100.0; // for example. Set your average height
self.tableView.rowHeight = UITableViewAutomaticDimension;
}
В cellForRowAtIndexPath напишите этот код,
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] ;
}
cell.textLabel.numberOfLines = 0; // Set label number of line to 0
cell.textLabel.text=[[self.arForTable objectAtIndex:indexPath.row] valueForKey:@"menu"];
[cell.textLabel sizeToFit]; //set size to fit
return cell;
}
Ответ 10
Для тех, кто, возможно, сталкивался со мной той же проблемой: я изо всех сил пытался заставить ее работать. Простой UIlabel с ограничениями сверху, снизу слева и справа. Я использовал willDisplayCell для передачи данных в ячейку, и это вызывало проблемы с высотой ячейки. Пока я поместил этот код в cellForRow, все работало просто отлично. Не понял, почему это произошло, может быть, высота ячейки была вычислена до вызова willDisplayCell, поэтому не было содержимого для правильного расчета. Я просто хотел упомянуть и, вероятно, помочь кому-то с той же проблемой.
Ответ 11
Для моей настройки я сначала дважды проверил ограничения в Storyboard, поскольку UITableViewCell
был однозначным сверху донизу, а затем пришлось модифицировать код в 2 местах.
-
UITableViewDelegate
tableView(_:heightForRowAt:)
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
// return UITableViewAutomaticDimension for older than Swift 4.2
}
-
UITableViewDelegate
tableView(_:estimatedHeightForRowAt:)
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
// return UITableViewAutomaticDimension for older than Swift 4.2
}
Шаг 1 и 2 позволяют применять автоматизацию только для определенных строк. Для применения ко всему UITableView
используйте:
tableView.rowHeight = UITableView.automaticDimension
tableView.estimatedRowHeight = UITableView.automaticDimension
// return UITableViewAutomaticDimension for older than Swift 4.2
Ответ 12
у меня нормально работало в iOS 11 и выше, в то время как в iOS 10 ломалось
решение было добавить
table.rowHeight = UITableView.automaticDimension
table.estimatedRowHeight = 200 // a number and not UITableView.automaticDimension
также убедитесь, что вы добавили "heightForRowAt", даже если он работает в iOS 11 и выше, это необходимо, если вы поддерживаете iOS 10
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
Ответ 13
Чтобы сделать работу UITableViewAutomaticDimension, вам нужно убедиться, что все ограничения в 4 угла добавлены в супервизор. В большинстве случаев он хорошо работает с UILabel, но иногда я нахожу, что UITextView делает трюк, когда UILabel не работает хорошо в то время. Поэтому попробуйте переключиться на UITextView и убедитесь, что Scrolling Enabled
не установлен в раскадровке, или вы также можете установить его программно.
Ответ 14
У меня было три горизонтальных элемента, и у большинства левых было ограничение слева, среднее - сверху, снизу, слева и справа. Правый имел право и оставил среднюю вещь. Решение заключалось в том, чтобы добавить дополнительные левые и правые ограничения к среднему элементу (моей метке), которые были >= некоторое число в ячейке.
Ответ 15
Убедитесь, что все представления в ячейке ограничены представлением содержимого, а не ячейкой.
Как говорит яблоко:
выложите содержимое ячеек таблицы в виде содержимого ячеек. Чтобы определить высоту ячеек, вам нужна непрерывная цепочка ограничений и представлений (с определенными высотами), чтобы заполнить область между верхним краем представления контента и его нижним краем.
Ответ 16
У меня есть новое решение.. это сработало для меня.
в основном UITableViewAutomaticDimension
переименован в UITableView.automaticDimension
... я надеюсь.. это горе