почему UITableViewAutomaticDimension не работает?
Привет есть много вопросов, отвечающих на динамическую высоту для UITableViewCell of UITableView. Однако я нахожу это странным, когда я это сделал.
вот некоторые из ответов :
здесь здесь
обычно это отвечало бы динамической высоте для ячейки
tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableViewAutomaticDimension
но в моем случае я удивляюсь, что эта линия ничего не делает.
мой UITableView просматривается после нажатия панели вкладок внутри splitview. Это полезно?
может быть, я что-то упустил. Может ли кто-нибудь помочь мне, я провел 2 часа, делая глупости.
Это мое ограничение для названия Название может быть длинным, но метка нет.

а это моя камера

12 ответов:
для того, чтобы сделать UITableViewAutomaticDimension работы вы должны установить все левые, правые, нижние и верхние ограничения относительно представления контейнера ячейки. В вашем случае вам нужно будет добавить недостающее нижнее пространство для ограничения superview для метки под заголовком
я добавил ограничения программно, и случайно добавил их в клетки напрямую, т. е. не на
contentViewсобственность. Добавление ограничений вcontentViewразрешил это для меня!
также убедитесь, что строки для вашего UILabel в ячейке установлены в 0. Если он установлен в 1, он не будет расти вертикально.
чтобы установить автоматический размер для высоты строки и расчетной высоты строки, выполните следующие действия, чтобы сделать автоматический размер эффективным для макета высоты ячейки/строки.
- назначить и реализовать tableview источник данных и делегировать
- присвоить
UITableViewAutomaticDimensionк rowHeight & estimatedRowHeight- реализовать делегат / источник данных методы (т. е.
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 (&line break mode = усечь хвост)
- установите все ограничения (сверху, снизу, справа слева) по отношению к его контейнеру superview/ cell.
- дополнительно: установите минимальную высоту для ярлыка, если вы хотите минимальную вертикальную область покрытую ярлыком, то даже если никакой данные.
Примечание: если у вас есть более одной метки (UIElements) с динамической длиной, которая должна быть скорректирована в соответствии с ее размером содержимого: отрегулируйте "приоритет сопротивления сжатию и сжатию содержимого" для меток, которые вы хотите расширить/сжать с более высоким приоритетом.
у меня есть конкретный случай, и 99% решений, которые я читал, не работали. Я решил поделиться своим опытом. Надеюсь, что это может помочь, так как я боролся в течение нескольких часов, прежде чем исправить эту проблему.
мой сценарий:
- я использую два табличных представления в одном ViewController
- я загрузка пользовательских ячеек (xib) в этих tableviews
- динамическое содержимое в ячейках состоит из двух этикетки
- страница использует 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 будет просто взять estimatedRowHeight и умножить его на количество ячеек. Meeeh.
поскольку я использую два разных табличных представления, я создал выход для каждого из них,
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() }надеюсь, что это поможет кому-то!
забыл убрать
tableView(heightForRowAt:indexPath:)Это может быть так, что как я, вы случайно забыл убрать шаблонный код
heightForRowAtметод.func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 60.0 }
начиная с iOS 11 и Xcode 9.3, большая часть приведенной выше информации неверна. руководство Apple предполагает задание
tableView.estimatedRowHeight = 85.0 tableView.rowHeight = UITableViewAutomaticDimensionWWDC 2017 сессия 245 (создание приложений с динамическим типом, около 16: 33 в видео) предполагает нечто подобное. Все это не имело для меня никакого значения.
для ячейки стиля субтитров все, что необходимо для получения ячеек табличного представления с самостоятельным размером, - это установить количество строк (в разделе метка атрибутов инспектор) 0 для заголовка и подзаголовка. Если одна из этих меток слишком длинная и вы не зададите количество строк равным 0, ячейка табличного представления не изменит свой размер.
в моем случае у меня было два 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; }
попробуйте это, простое решение это работа для меня,
в 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; }
для того, чтобы сделать UITableViewAutomaticDimension на работу, вы должны убедиться, что ограничения по всем 4 углам добавляется к суперпанель. В большинстве случаев он хорошо работает с UILabel, но иногда я нахожу, что UITextView делает трюк, когда UILabel не работает хорошо в то время. Поэтому попробуйте переключиться на UITextView и убедитесь
Scrolling Enabledне установлен в раскадровке, или вы также можете установить его программно.
У меня было три горизонтальных элемента, и самый левый имел ограничение налево, средний-сверху, снизу, слева и справа. У правого был правый, а у левого-средний предмет. Решение состояло в том, чтобы добавить дополнительные левые и правые ограничения к среднему элементу (моя метка), которые были >= некоторое число в ячейку.
убедитесь, что все представления в ячейке ограничены представлением содержимого, а не ячейкой.
Как говорит apple:
выложите содержимое ячейки табличного представления в представлении содержимого ячейки. Чтобы определить высоту ячейки, вам нужна непрерывная цепочка ограничений и видов (с определенными высотами), чтобы заполнить область между верхним краем представления содержимого и его нижним краем.

Comments