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

IOS 8 Автоматическая высота ячейки не соответствует высоте при первой нагрузке

У меня есть приложение iOS 8, где у меня есть страница результатов поиска, каждая ячейка авторизована в зависимости от высоты определенной метки. Однако после того, как сначала загрузится представление, отображаемые ячейки не будут авторизоваться. После прокрутки вниз по ячейкам, которые следуют, правильно заданы. Я подключаю ограничения авто макета в своем раскадровке. У меня есть следующий код в viewDidLoad.

- (void)viewDidLoad {
    [super viewDidLoad];

    //configure tableView so that we use autolayout enabled row heights
    self.tableView.estimatedRowHeight = 68;
    self.tableView.rowHeight = UITableViewAutomaticDimension;
}

Кто-нибудь еще испытал это?

4b9b3361

Ответ 1

Да, я видел эту же проблему при создании представлений и ограничений в раскадровке (но не с добавлением кода). Iv'e исправил это, добавив этот код в пользовательский класс ячеек,

-(void)didMoveToSuperview { 
    [self layoutIfNeeded];
}

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

Ответ 2

Ответ от rdelmar не помог мне.

Что я сделал, добавлен этот код:

[tableView setNeedsLayout];
[tableView layoutIfNeeded];
[tableView reloadData];

после получения данных и вызывается первая [tableView reloadData], которая в моем случае находится в методе viewDidLoad моего контроллера просмотра.

Таким образом, код результата будет выглядеть следующим образом:

NSArray *fetchedData = ...

[tableView reloadData]; //Fist table reload
[tableView setNeedsLayout];
[tableView layoutIfNeeded];
[tableView reloadData]; //Second table reload

Этот ответ берется здесь: http://useyourloaf.com/blog/self-sizing-table-view-cells.html#comment-1783719287

Ответ 3

Я думаю, вместо того, чтобы форсировать tableView.reloadData() и tableView.layoutIfNeeded() в viewDidLoad, вы можете просто установить максимальную высоту таблицы tableView в viewWillLayoutSubviews():

Swift:

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    tableView.estimatedRowHeight = 300
    tableView.rowHeight = UITableViewAutomaticDimension
}

Ответ 4

У меня была та же проблема и я исправил ее, переместив назначения в текстовые свойства ячейки UILabels (являющиеся единственными компонентами, которые могли повлиять на вычисление высоты в моей конкретной ячейке):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

вместо:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

Прежде чем это сделать, я заметил, что высота ячейки будет правильно рассчитана, если ячейка была прокручена мгновенно за кадром, а затем снова в поле зрения. Скорее всего, потому, что в этот момент ячейка имела необходимую информацию о содержимом UILabel, определяющем конечную высоту.

Ответ 5

Мне удалось обойти это, не используя nibs/раскадровки, а скорее сделайте макет программным путем.