Altura do quadro UITableViewCell não compatível tableView: heightForRowAtIndexPath:

Eu estou construindo um UITableView com células de tabela personalizada de altura variável, sua altura determinada pelo tamanho de um UILabel continha várias linhas. Eu tenho otableView:heightForRowAtIndexPath: delegate método ligado e calcular a altura final corretamente usandosizeWithFont:constrainedToSize:.

Eu me deparei com um problema estranho: no momento em que o método da fonte de dadostableView:cellForRowAtIndexPath: é chamado, a altura correta por linha já foi determinada conforme descrito acima, mas o quadro da célula não corresponde a essa altura. Em vez disso, oframe.size.height propriedade da célula é a altura da célula padrão da visualização de tabela (86 px, como eu configurei no Interface Builder, a altura correta quando o UILabel contido tem apenas uma linha de texto), em vez de ser a altura quetableView:heightForRowAtIndexPath: determinado correto para esse caminho de índice.

Estou produzindo as células emcellForRowAtIndexPath: usando dequeuing, isto é,

// Using storyboards, this never returns nil, no need to check for it
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"SomeIdentifier"];
NSLog(@"%f", cell.frame.size.height); // 86, not correct if the cell contains a multi-line UILabel

Parece, então, que, seja o que for que o iOS esteja fazendo nos bastidores, o dequeuing não está definindo a propriedade de quadro da célula para corresponder à altura calculada. Isso por si só não é surpreendente, o que torna a atenção as instâncias de células, não sua geometria. As células são renderizadas corretamente, portanto, a propriedade height está sendo definidaalgum lugar, mas acontece depoiscellForRowAtIndexPath:.

Então, quando eu inicialmente preenchei a visão de tabela,cell.frame.size.height é 86 para todas as células conforme elas aparecem pela primeira vez quando eu rolar a lista para baixo. Como a geometria correta é definida após o primeirocellForRowAtIndexPath: Para cada linha antes de ser exibida, quando eu rolar de volta para cima, a propriedade height está correta para cada célula que volta à exibição após ser reutilizada.

Depois disso, posso rolar a exibição da tabela para frente e para trás à vontade, e a propriedade height permanece correta para cada célula daquele ponto em diante.

Qual é a maneira correta de obter a altura correta da célula na primeira vez, antes que qualquer reutilização baseada em desenfileiramento aconteça? Eu preciso disso para fazer um pouco de reposicionamento das subvisualizações da célula da tabela. Preciso ligar manualmenteheightForRowAtIndexPath: emcellForRowAtIndexPath: e, em seguida, definir manualmente o quadro da instância CustomCell recém-criada para corresponder a essa altura? Isso parece redundante, e eu preciso criar um mecanismo para detectar quando a célula é criada pela primeira vez com a altura do quadro errada vs. quando ela é retirada da altura do quadro correta mais tarde para evitar essa redundância.

Então, se alguém puder lançar alguma luz sobre o que a lógica está por trás disso, eu agradeceria.

questionAnswers(3)

yourAnswerToTheQuestion