Динамически увеличивать высоту ячейки UILabel и TableView?

У меня есть UITableView, в котором я показываю настраиваемую ячейку. В моей ячейке есть две метки и одно представление, как показано ниже на рисунке.

введите описание изображения здесь

Я дал такое ограничение левого обзора

Ограничения на ярлык элемента

введите описание изображения здесь

ограничения просмотра по центру

введите описание изображения здесь

ограничения просмотра справа

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

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    // Calculate a height based on a cell
    if(!self.customCell) {
        self.customCell = [self.tableView dequeueReusableCellWithIdentifier:@"thirdcell"];
    }

    // Configure the cell
    Instrument *inst=[arr_instSpecs objectAtIndex:indexPath.row];
    self.customCell.label_item.text=inst.item;
    self.customCell.label_desc.text=inst.desc;


    // Layout the cell

    [self.customCell layoutIfNeeded];

    // Get the height for the cell

    CGFloat height = [self.customCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

    // Padding of 1 point (cell separator)
    CGFloat separatorHeight = 1;

    return height + separatorHeight;
}

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


person Dheeraj Kumar    schedule 17.03.2016    source источник
comment
В вашем вопросе непонятно, чего вы хотите достичь. По-прежнему из вашего кода вы возвращаете высоту, вместо этого вычисляя UITableViewAutomaticDimension.   -  person Bharat Modi    schedule 17.03.2016
comment
Есть множество ответов о подобном сценарии на SO, это один из stackoverflow.com/questions/19215199/   -  person Bharat Modi    schedule 17.03.2016
comment
Я все объяснил. Я хочу, чтобы размер метки увеличивался, когда увеличивается текст метки, а также, когда увеличивается размер метки, тогда должна увеличиваться высота ячейки.   -  person Dheeraj Kumar    schedule 17.03.2016
comment
Являются ли "Item" и "Description" классом UILabel? А в твоей ячейке всего две метки?   -  person Bharat Modi    schedule 17.03.2016
comment
Вы упомянули, что у вас есть одно представление и в камере, где оно находится? И в чем его польза?   -  person Bharat Modi    schedule 17.03.2016
comment
зеленая линия - вертикальный вид, я добавил ее, чтобы разделитель между двумя метками   -  person Dheeraj Kumar    schedule 17.03.2016


Ответы (8)


Прежде всего, вам не следует рассчитывать высоту вручную в среде автоматической компоновки. Просто установите обе метки TopSpace и BottomSpace на contentView ячейки и убедитесь, что вы установили обе метки NumberOfLines на 0 и LineBreakMode на WordWrap.

И другое ограничение, как показано ниже,

ItemLabel:

введите здесь описание изображения

SeparatorView:

введите здесь описание изображения

DescriptionLabel:

введите здесь описание изображения

И добавьте делегатов по высоте, как показано ниже,

#pragma mark - UITableView Delegates
-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {

    return 44.0;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    return UITableViewAutomaticDimension;
}

Вы должны получить результат, как показано ниже,

введите описание изображения здесь

Надеюсь, это поможет тебе.

person Bharat Modi    schedule 17.03.2016

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

  • Назначьте и реализуйте источник данных 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;
}

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

введите описание изображения здесь

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

person Krunal    schedule 27.07.2017
comment
У меня есть старые xib-файлы с ограничениями по маске ... вы знаете, как это сделать для xib-файлов с ограничениями по маске? - person jayant rawat; 31.01.2020

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

tblObject.estimatedRowHeight = 300;
tblObject.rowHeight = UITableViewAutomaticDimension;
person Meera    schedule 17.03.2016

Вот как я работал.

1) Установите № строк до 0.

2) Установите разрыв линии.

введите описание изображения здесь

3) Добавить ограничения.

введите описание изображения здесь

4) Измените приоритет вертикального размещения контента.

введите описание изображения здесь

5) В ViewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()

    self.sampleTableView.estimatedRowHeight = 600.0;
    self.sampleTableView.rowHeight = UITableViewAutomaticDimension;

    self.sampleTableView.setNeedsLayout()
    self.sampleTableView.layoutIfNeeded()
}

6) В пользовательской ячейке TableView:

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code

    sizeToFit()
    layoutIfNeeded()
}
person A.G    schedule 20.10.2016

Задайте ограничение метки сверху для ячейки, снизу для ячейки и сохраните ведущее и конечное ограничение как есть. В

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
   return UITableViewAutomaticDimension;
}

-(CGFloat)tableView:(UITableView *)tableView
    estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return UITableViewAutomaticDimension;
}

при использовании UITableViewAutomaticDimension высота вашей ячейки tableview будет увеличиваться в соответствии с содержимым вашей метки, и наиболее важным моментом является выберите метку, затем перейдите в Identity Inspector и в количестве строк напишите 0

person Vatsal Raval    schedule 17.03.2016

Свифт 3 / Свифт 4

Пользовательская ячейка:

class CustomCell: UITableViewCell {

    @IBOutlet var messageLabel: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()

        sizeToFit()
        layoutIfNeeded()

    }

}

viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()        

    self.tableView.estimatedRowHeight = 80
    self.tableView.rowHeight = UITableViewAutomaticDimension

}

И cellForRowAtIndexPath:

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

     let cell : CustomCell = tableView.dequeueReusableCell(withIdentifier: "yourcellIdentifier", for: indexPath) as! CustomCell
     cell.messageLabel.text = exampleContent[indexPath.row]
     cell.messageLabel.sizeToFit()
     cell.messageLabel.layoutIfNeeded()
     return cell

}

person john raja    schedule 19.05.2018

Swift 4.2

Для ячеек типа Basic или Subtitle сначала в viewDidLoad выполните следующее:

    self.tableView.estimatedRowHeight = 44 // This is the default cell height
    self.tableView.rowHeight = UITableView.automaticDimension

введите здесь описание изображения

Затем выберите заголовок и установите для него количество строк равным 0. Теперь строка будет регулировать свою высоту в зависимости от текста заголовка. Больше ничего делать не нужно.

введите здесь описание изображения

То же самое и с пользовательскими типами ячеек. Убедитесь, что метка, которую вы используете в своей пользовательской ячейке, также установлена ​​на 0 строк.

person zeeshan    schedule 21.01.2019

Я работал над чужим кодом, и ни один из приведенных ответов не помог мне. Ограничения были правильными. Изменение желаемой ширины метки на автоматическую в раскадровке помогло мне. Для этого снимите флажок «Явный» в инспекторе размеров для метки.

Так и должно быть

person Deveesh    schedule 01.02.2021