2016-03-15 2 views
6

Я хочу рассчитать размер содержимого моего UITableView. Я использую автозапуск с высотой UITableViewAutomaticDimension.Размер содержимого UITableView при использовании автоматического макета

Попытался получить [UITableView contentsize] после перегрузки стола, в этом случае высота рассчитывается на основе estimatedRowHeight.

self.tableView.estimatedRowHeight = 50; 
self.tableView.rowHeight = UITableViewAutomaticDimension; 

Делегат -

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

Попытка получить размер контента и назначить его на высоте Constrain.

[self.tableView reloadData]; 
[self.tableView layoutIfNeeded]; 
self.tableHeightConstraint.constant = self.tableView.contentSize.height; 

Любые предложения? Заранее спасибо.

Edit:

Наконец я решил свою проблему с некоторой подстройкой. Я изменил высоту таблицы до макс (в моем случае 300 макс.), Прежде чем перезагружать данные в таблице, поэтому в таблице есть пространство для изменения размера всех ячеек.

self.tableHeightConstraint.constant = 300; 
[self.tableView reloadData]; 
[self.tableView layoutIfNeeded]; 
self.tableHeightConstraint.constant = self.tableView.contentSize.height; 

Спасибо за помощь.

+0

Не могли бы вы объяснить подробно проблему? –

+0

Я хочу содержимое таблицы. поэтому я могу изменить рамку tableview & superview в отношении содержимого. Я использую autolayout и UITableViewAutomaticDimension. поэтому он не работает точно. – OMK

+0

Если вы используете 'Autolayout', вы не можете изменить рамку. Вам нужно играть с 'NSLayoutContraints'. –

ответ

7

Наконец-то я решил проблему с некоторыми настройками. Я изменил высоту таблицы до макс (в моем случае 300 макс.), Прежде чем перезагружать данные в таблице, поэтому в таблице есть пространство для изменения размера всех ячеек.

self.tableHeightConstraint.constant = 300; 
[self.tableView reloadData]; 
[self.tableView layoutIfNeeded]; 
self.tableHeightConstraint.constant = self.tableView.contentSize.height; 

Публикация этого сообщения будет полезной для других пользователей.

+0

где использовать этот код? –

+0

Откуда вы знаете, что 300 - это максимум (или достаточно). У меня есть tableview в scrollview, и tableview должен иметь высоту своего содержимого. И я нахожу, что я должен предоставить tableview начальную высоту, большую, чем '([self.tableView numberOfRowInSection: 0] - 1) * measuredHeight'. Также высота должна быть установлена ​​в методе 'viewWillLayoutSubviews', это просто работает, я не могу понять, почему. – ooops

+0

Это действительно работает. Знаете ли вы, почему нам нужно сначала установить constraint.constant в max? Без этого это не сработает. –

5

Наконец-то я понял вашу проблему и вот ее решение.

Надеюсь, вы уже это сделали.

  1. Сначала возьмите положительную высоту UITableView.
  2. Затем принять ограничение IBOutlet от UITableView Высота.
  3. Затем под viewDidLayoutSubviews вы можете получить исходную высоту UITableView после заполнения данных.

Обновить код ниже:

override func viewDidLayoutSubviews() { 

    constTableViewHeight.constant = tableView.contentSize.height 
} 

Обновление:

self.tableView.estimatedRowHeight = UITableViewAutomaticDimension;

Пожалуйста, проверьте это.

+3

Я сделал то же самое. Не работает. tableView.contentSize рассчитывается на основе оценочногоRowHeight. Мне нужна высота после изменения размера всех ячеек. – OMK

+0

@OMK Проверьте отредактированный ответ –

+0

Спасибо за помощь. Отредактированный вопрос с решением, которое я нашел. – OMK

0

Вы можете попробовать две вещи,

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

    - (void)adjustHeightOfTableview 
    { 
        dispatch_async(dispatch_get_main_queue(), ^{ 
    
        [self.tableView reloadData]; 
    
        //In my case i had to call this method after some delay, because (i think) it will allow tableView to reload completely and then calculate the height required for itself. (This might be a workaround, but it worked for me) 
        [self performSelector:@selector(adjustHeightOfTableview) withObject:nil afterDelay:0.3]; 
        }); 
    } 
    
  2. При вызове метода выше, не возвращаются estimatedHeightForRow,

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

Просто дайте ему попробовать, это может помочь вам получить эту проблему.

+0

Спасибо за помощь. Отредактированный вопрос с решением, которое я нашел. – OMK

+0

Приветствия! Happy encoding .. –

1

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

По какой-то причине это гарантировало, что свойство estimatedRowHeight не использовалось для определения contentSize. Я не показываю индикатор прокрутки, поэтому мне не важно, что estimatedRowHeight ушел.

Смежные вопросы