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;
}
Кто-нибудь еще испытал это?
Ответы
Ответ 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/раскадровки, а скорее сделайте макет программным путем.