Calling reloadData
on the tableView does not change the content offset. However, if you are using UITableViewAutomaticDimension
which was introduced in iOS 8, you could have an issue.
While using UITableViewAutomaticDimension
, one needs to write the delegate method tableView: estimatedHeightForRowAtIndexPath:
and return UITableViewAutomaticDimension
along with tableView: heightForRowAtIndexPath:
which also returns the same.
For me, I had issues in iOS 8 while using this. It was because the method estimatedHeightForRowAtIndexPath:
method was returning inaccurate values even though I was using UITableViewAutomaticDimension
. It was problem with iOS 8 as there was no issue with iOS 9 devices.
I solved this problem by using a dictionary to store the value of the cell's height and returning it. This is what I did.
- (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;
}
The check for whether height exists is for the first time page loads.