Error UITableView en iOS8 cuando se seleccionan ítems con una altura estimada diferente de la altura de la fila

Estoy trabajando en un proyecto que es tanto iOS7 como iOS8. Y me encontré con este error en iOS8, donde la vista de tabla saltará al seleccionar un elemento.

Este error solo existe cuando se establece la altura estimada y difiere de la altura de la fila.

Aquí hay dos gifs del mismo código en iOS8 e iOS7. Primero iOS8:

TableView en iOS8

Y ahora en iOS7:

TableView en iOS7

He realizado un proyecto de ejemplo que muestra el error aquí: https://github.com/bjarkehs/TableViewiOS8Bug

No estoy seguro si simplemente me falta algo, pero estoy atascado con este problema y no he podido encontrar nada sobre esto.

Aquí están mis methods tableView:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 3; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (section == 1) { return 30; } return 20; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; } cell.textLabel.text = [NSString stringWithFormat:@"%@ %ld", @"Wat", indexPath.row]; return cell; } - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { return 45.f; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 50.f; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [self.navigationController pushViewController:[UIViewController new] animated:YES]; } 

Aquí hay un ejemplo de viewcontroller donde la altura calculada no está codificada, mostrando el mismo problema:

 #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UITableView *tableView; @end @implementation ViewController { NSMutableArray *_items; CGFloat _estimatedHeight; } - (void)viewDidLoad { [super viewDidLoad]; self.tableView.delegate = self; self.tableView.dataSource = self; _estimatedHeight = 70.f; CGFloat randomOffset = 30.f; _items = [NSMutableArray new]; for (NSInteger i = 0; i < 3; i++) { NSMutableArray *tempItems = [NSMutableArray new]; for (NSInteger j = 0; j < 30; j++) { NSInteger offset = arc4random_uniform(randomOffset); [tempItems addObject:@(_estimatedHeight + (randomOffset/2) - offset)]; } [_items addObject:tempItems]; } // Do any additional setup after loading the view. } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 3; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (section == 1) { return 30; } return 20; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; } cell.textLabel.text = [NSString stringWithFormat:@"%@ %ld", @"Wat", indexPath.row]; return cell; } - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { return _estimatedHeight; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return [[[_items objectAtIndex:indexPath.section] objectAtIndex:indexPath.row] floatValue]; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [self.navigationController pushViewController:[UIViewController new] animated:YES]; } @end 

Su implementación para la altura estimada para At Index no es algo que haya visto antes. Echa un vistazo a esto donde detallamos usando este patrón …

Ejemplo de altura estimada