Zamierzam odpowiedzieć na moje własne pytanie tutaj:
Początkowo byłem dość pewny, że obliczenia wysokości były przywiązane do metody tableView:cellForRowAtIndexPath:
, i nie może być przeniesiony gdzie indziej. Jednak dzięki kilku restrukturyzacjom udało mi się wydobyć te rzeczy i wprowadzić je do tableView:heightForRowAtIndexPath:
, co rozwiązuje wszystko.
Dla każdego, kto stara się uzyskać komórki auto-wysokość dostosowana do pracy, tu jest jakiś kod, który może pomóc:
// 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
}
}
Jeśli można myśleć o bardziej dokładny sposób obliczyć prawidłową wysokość komórek, Zamieniam się w słuch. :)
Nie jestem pewien, dlaczego dzielisz prostą wysokość o 18, a następnie powtarzasz ją ponownie, ale poza tym robię to prawie w ten sam sposób. –
Cóż, pierwszym działem jest sprawdzenie, ile rzędów jest potrzebnych, aby można było poprawnie ustawić 'cell.textLabel.numberOfLines'; jeśli tego nie ustawię, wszystko zostanie wydrukowane w jednej linii. Ale tak, myślę, że mógłbym użyć 'theSize.height' w tym ostatnim miejscu, zamiast' self.numberOfTextRows'. – Triz
Edytował odpowiedź dla jasności i uproszczenia. Działa teraz naprawdę dobrze. – Triz