it-roy-ru.com

почему UITableViewAutomaticDimension не работает?

Привет, есть много вопросов, отвечающих на динамическую высоту для UITableViewCell из UITableView. Однако я нахожу это странным, когда я это сделал.

вот некоторые из ответов:

здесь и здесь

обычно это отвечало бы динамической высоте ячейки

tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableViewAutomaticDimension

но в моем случае я удивляюсь, что эта строка ничего не сделает.

my UITableView просматривается после нажатия на вкладку внутри splitview. Это полезно? 

Может быть, я что-то скучаю. Может ли кто-нибудь помочь мне, я провел 2 часа, делая глупости. 

Это мое ограничение для заголовка, заголовок может быть длинным, но метка - нет.

enter image description here

и это моя клетка

enter image description here

56
CaffeineShots

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

126
Zell B.

Я добавил ограничения программным способом и случайно добавил их в ячейку напрямую, т. Е. Не в свойстве contentView. Добавление ограничений к contentView разрешило это для меня!

21
Eyeball

Также убедитесь, что для линий UILabel в ячейке установлено значение 0. Если установлено значение 1, оно не будет расти вертикально. 

16
CamQuest

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

  • Назначить и реализовать источник данных tableview и делегировать
  • Назначьте UITableViewAutomaticDimension для rowHeight и оценкаRowHeight
  • Реализуйте методы делегата/источника данных (т.е. 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;
}

Свифт:

@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 (& режим разрыва строки = обрезать хвост)
  • Установите все ограничения (сверху, снизу, справа налево) относительно его контейнера superview/cell.
  • Необязательно: установите минимальную высоту для метки, если вы хотите, чтобы минимальная вертикальная область была покрыта меткой, даже если нет данных.

enter image description here

Примечание : Если у вас более одной метки (UIElements) с динамической длиной, которая должна быть скорректирована в соответствии с размером ее содержимого: настройте «Приоритет содержания и сопротивления сжатию» для меток, которые вы хотите расширить/сжать с помощью более высокий приоритет.

14
Krunal

Начиная с iOS 11 и Xcode 9.3, большая часть вышеуказанной информации неверна. Руководство Apple предлагает настройки

    tableView.estimatedRowHeight = 85.0
    tableView.rowHeight = UITableViewAutomaticDimension

Сессия WWDC 2017 245 (Создание приложений с динамическим типом, около 16:33 в видео) предлагает нечто подобное. Ничто из этого не имело значения для меня.

Для ячейки стиля Субтитров все, что необходимо для получения ячеек представления таблицы с самоопределением размера, - это установить количество строк (в разделе «Метка» инспектора атрибутов) равным 0 как для Заголовка, так и для Субтитра. Если одна из этих меток слишком длинная, а количество строк не установлено на 0, ячейка табличного представления не будет корректировать свой размер.

4
Zampano

У меня есть конкретный случай, и 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()
    }
    

Надеюсь, что это помогает кому-то!

4
Bptstmlgt

Забыли удалить tableView(heightForRowAt:indexPath:)

Может случиться так, что, как и я, вы случайно забыли удалить шаблонный код для метода heightForRowAt

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 60.0
}
3
Guy Daher

Попробуйте это, Простое решение, это работа для меня,

Во 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;
 }
2
Jaywant Khedkar

В моем случае у меня было два UITableView, я должен был изменить этот метод как

-(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;
}
2
user1994956

Для моей настройки я сначала дважды проверил ограничения в раскадровке для UITableViewCell однозначно сверху вниз, а затем пришлось модифицировать код в 2 местах. 

  1. UITableViewDelegate's tableView(_:heightForRowAt:)

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableView.automaticDimension
        // return UITableViewAutomaticDimension for older than Swift 4.2
    }
    
  2. UITableViewDelegate's 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
0
Pranav Kasetti

У меня было три горизонтальных элемента, и у большинства левых было ограничение слева, у среднего - сверху, снизу, слева и справа. Правый имел право, а слева - средний пункт. Решение состояло в том, чтобы добавить дополнительные левые и правые ограничения к среднему элементу (мой ярлык), которые были> = некоторое число в ячейке.

0
user3739902

Для того, чтобы UITableViewAutomaticDimension работал, вам нужно убедиться, что ограничения всех 4 углов добавлены к суперпредставлению. В большинстве случаев это работает хорошо с UILabel, но иногда я нахожу, что UITextView добивается цели, когда UILabel не работает хорошо в то время. Поэтому попробуйте переключиться на UITextView и убедитесь, что Scrolling Enabled не отмечен в раскадровке, или вы также можете установить его программно.

0
Terry Tan

У меня есть новое решение .. это сработало для меня.

в основном UITableViewAutomaticDimension переименован в UITableView.automaticDimension... я надеюсь .. это горе

0
Yeasir Arafat Aronno

Убедитесь, что все представления в ячейке ограничены представлением содержимого, а не ячейкой. 

Как говорит Apple:

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

0
fullMoon