Andando rispondere alla mia domanda qui:
Originariamente ero abbastanza sicuro che i calcoli di altezza erano legate al metodo tableView:cellForRowAtIndexPath:
, e non potevano essere spostati altrove. Con un po 'di ristrutturazione, però, sono stato in grado di ottenere quella roba da lì e in tableView:heightForRowAtIndexPath:
, che risolve tutto.
Per chiunque altro che sta cercando di ottenere cellule auto-regolati in altezza per lavorare, ecco qualche codice che potrebbe aiutare:
// Inside tableView:cellForRowAtIndexPath:
cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
cell.textLabel.numberOfLines = self.numberOfTextRows;
// numberOfTextRows is an integer, declared in the class
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
CGSize theSize = [theObject.theStringToDisplay sizeWithFont:[UIFont systemFontOfSize:18.0f] constrainedToSize:CGSizeMake(265.0f, 9999.0f) lineBreakMode:UILineBreakModeWordWrap];
// This gets the size of the rectangle needed to draw a multi-line string
self.numberOfTextRows = round(theSize.height/18);
// 18 is the size of the font used in the text label
// This will give us the number of lines in the multi-line string
if ((indexPath.section == FIXED_HEIGHT_SECTION) || (self.numberOfTextRows < 2)) {
return 44;
// 44 is the default row height; use it for empty or one-line cells (or in other table sections)
} else {
return theSize.height + 16;
// 16 seems to provide a decent space above/below; tweak to taste
}
}
Se si può pensare a un modo più preciso per calcolare l'altezza della cella corretta, Sono tutto orecchie. :)
Io non sono davvero sicuro perché devi dividere l'altezza del retto per 18 e poi moltiplicarlo di nuovo, ma a parte questo lo faccio più o meno allo stesso modo. –
Bene, la prima divisione è scoprire quante righe sono necessarie, quindi posso impostare 'cell.textLabel.numberOfLines' correttamente; se non lo imposto, viene stampato su un'unica riga. Ma sì, credo che potrei usare 'theSize.height' nell'ultimo bit lì, invece di' self.numberOfTextRows'. – Triz
Modificato la risposta per chiarezza e semplificazione. Funziona davvero bene ora. – Triz