Вызов reloadData
в tableView не меняет смещение содержимого. Однако, если вы используете UITableViewAutomaticDimension
, который был представлен в iOS 8, у вас может возникнуть проблема.
При использовании UITableViewAutomaticDimension
необходимо написать метод делегата tableView: estimatedHeightForRowAtIndexPath:
и вернуть UITableViewAutomaticDimension
вместе с tableView: heightForRowAtIndexPath:
, который также возвращает то же самое.
У меня были проблемы с iOS 8 при использовании этого. Это было потому, что метод estimatedHeightForRowAtIndexPath:
возвращал неточные значения, хотя я использовал UITableViewAutomaticDimension
. Это была проблема с iOS 8, поскольку не было проблем с устройствами на iOS 9.
Я решил эту проблему, используя словарь для хранения значения высоты ячейки и его возврата. Это то, что я сделал.
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
NSNumber *key = @(indexPath.row);
NSNumber *height = @(cell.frame.size.height);
[self.cellHeightsDictionary setObject:height forKey:key];
}
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSNumber *key = @(indexPath.row);
NSNumber *height = [self.cellHeightsDictionary objectForKey:key];
if (height)
{
return height.doubleValue;
}
return UITableViewAutomaticDimension;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewAutomaticDimension;
}
Проверка наличия высоты выполняется при первой загрузке страницы.