Подтвердить что ты не робот

Как сделать динамическую высоту UITableView с функцией автозапуска?

Я использую автозапуск в Xcode 5.

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

Но размер всегда равен 200px. И если содержимое больше этого, я должен прокрутить вниз, чтобы увидеть нижние строки.

Что мне делать, чтобы дать динамический размер tableview? enter image description here

4b9b3361

Ответ 1

Это протестировано с последней версией Xcode.

1) В Xcode перейдите в раскадровку и нажмите на нее, чтобы выбрать ее.

2) На панели "Утилиты" (см. рисунок 1) убедитесь, что определено ограничение высоты таблицы.

Table view heigth constraint

3) В контроллере представления, отображающем представление таблицы, создайте выход для этого ограничения:

В Swift 3

@IBOutlet weak var dynamicTVHeight: NSLayoutConstraint!

В Objective C

@property (strong, nonatomic) IBOutlet NSLayoutConstraint *dynamicTVHeight;

4) В раскадровке вернитесь к ограничению высоты для UITableView и убедитесь, что значок справа изменил цвет с фиолетового на синий (см. рисунок 2)

Table view heigth constraint after outlet

4) Также поместите этот код в один и тот же контроллер:

Свифта

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    tableView.reloadData()
}


override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let height = min(self.view.bounds.size.height, tableView.contentSize.height)
    dynamicTVHeight.constant = height
    self.view.layoutIfNeeded()
}

Цель C

- (void)viewWillAppear:(BOOL)animated
{
    // just add this line to the end of this method or create it if it does not exist
    [self.tableView reloadData]; 
}

-(void)viewDidLayoutSubviews
{
    CGFloat height = MIN(self.view.bounds.size.height, self.tableView.contentSize.height);
    self.dynamicTVHeight.constant = height;
    [self.view layoutIfNeeded];
}

Это должно решить вашу проблему.

Это ссылки на две версии примерного проекта, который делает то, что вы хотите, один для Objective C, а другой для Swift 3. Загрузите его и протестируйте его с помощью Xcode. Оба проекта работают с последней версией Xcode, Xcode 8.3.2.

https://github.com/jcatalan007/TestTableviewAutolayout https://github.com/jcatalan007/TestTableviewAutolayoutSwift

Ответ 2

создайте свою ячейку по xib или раскадровке. дайте ему содержимое на выходе. теперь вызовите его в CellForRowAtIndexPath. например. если вы хотите установить высоту ячейки в соответствии с текстом метки комментария. enter image description here

поэтому установите для вас комментарииLbl.numberOfLine = 0;

затем в ViewDidLoad

 self.table.estimatedRowHeight = 44.0 ;
self.table.rowHeight = UITableViewAutomaticDimension;

и теперь

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

voila............ вы сделали это....

Ответ 3

Это можно сделать программно. Концепция (и сам код) на самом деле очень проста:

В методе updateConstraints класса myTableView добавьте ограничение, чтобы высота myTableView была равна myTableView.contentSize.height.

Протестировано на Xcode 6, ориентированном на iOS 7.

Ответ 4

Вы можете Ctrl + перетащить ограничение высоты вашего UITableView в исходный код контроллера просмотра и присвоить ему имя. Затем в updateViewConstraints вашего ViewController вы можете установить константу этого ограничения в tableView.contentSize.height

....

@IBOutlet weak var tableViewHeightConstraint: NSLayoutConstraint?

....

override func updateViewConstraints() {
    super.updateViewConstraints()
    tableViewHeightConstraint?.constant = tableView.contentSize.height
}