Il metodo tableView:heightForRowAtIndexPath:indexPath del protocol UITableViewDelegate permette di ridefinire a runtime l’altezza delle celle. Se in una UITableView abbiamo celle di altezze diverse (e magari non note a priori) possiamo sfruttare questo metodo in modo intelligente:
1 2 3 4 5 6 7 | #pragma mark - UITableViewDelegate Methods - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath]; return cell.frame.size.height; } |
In pratica ricaviamo la cella corrente dal data source e recuperiamo la sua altezza effettiva. Attenzione a non cadere nel subdolo tranello di richiedere la cella corrente direttamente alla tableView (o a self.table) in questo modo:
1 2 3 4 5 6 7 8 | #pragma mark - UITableViewDelegate Methods - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // errore! UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; return cell.frame.size.height; } |
Facendo così si manderà il programma loop! Questo perché la cella non è ancora presente nella tableView ma solo nel datasource. Se si tenta di recuperare la cella direttamente dalla tableView questa, essendone priva, ne richiederà una nuova al data source che a sua volta richiamerà tableView:heightForRowAtIndexPath:indexPath per ottere l’altezza e così via in un circolo senza fine. Anzi no con una fine: EXC_BAD_ACCESS!
Per finire piccola nota sulle performance:
in effetti questo metodo non è molto efficiente in quanto ogni singola cella viene creata due volte, la prima per misurare l’altezza e la seconda volta per poter essere aggiunta alla tabella. E’ chiaro che ci sono ampi margini di miglioramento. Magari li vediamo in un prossimo articolo
con questo metodo si restituisce un altezza, come si fa a impostare l’altezza di una cella a seconda del contenuto? cioè se ho molto testo si allunga se ne ho poco si accorcia
Questo metodo, che tra l’altro non è molto efficiente in quanto crea due volte la cella, serve quando le dimensioni sono definite a priori sullo xib della cella.
Quello che chiedi tu è molto diverso e un po’ più complicato. Devi misurare il contenuto e questo dipende da che tipo di contenuto stai visualizzando. Se si parla solo di testo in una UILabel puoi utilizzare il metodo sizeWithFont:constrainedToSize:lineBreakMode: della classe NSString. Con questo metodo ottieni l’altezza effettiva del testo contenuto in una UILabel di certe dimensioni. Sommi l’altezza del testo con la parte restante della cella e dovresti ottenere l’altezza definitiva. E’ più difficile spiegare a parole che con due righe di codice. Magari preparo un articolo appena ho del tempo libero. ciao