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

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

enter image description here

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

Ограничения метки товара

enter image description here

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

enter image description here

правый взгляд

enter image description here
Я использую класс bean для хранения данных для двух меток и добавления этого объекта bean в один массив. Я использую приведенный ниже код в 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;
}

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

Ответ 1

Прежде всего, вы не должны вычислять высоту вручную в среде автоматического компоновки. Просто установите обе метки TopSpace и BottomSpace в содержимое cellView и убедитесь, что вы установили обе метки 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;
}

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

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

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

Ответ 2

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

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

enter image description here

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

Ответ 3

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

tblObject.estimatedRowHeight = 300;
tblObject.rowHeight = UITableViewAutomaticDimension;

Ответ 4

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

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

2) Установите LineBreakage.

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

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 Custom Cell:

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

    sizeToFit()
    layoutIfNeeded()
}

Ответ 5

Дайте ограничение на ярлык в верхней части ячейки Cell, Bottom to cell и сохраните ограничения Leading и trailing. В

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

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

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

Ответ 6

Свифт 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

}

Ответ 7

Swift 4.2

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

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

enter image description here

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

enter image description here

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