Massimo Oliviero

I deliri digitali di un programmatore informatico e aspirante fotografo…
ottobre 13th, 2011 by Massimo

iOS, altezza dinamica di una UITableViewCell

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 ;)

Comments

2 Responses to “iOS, altezza dinamica di una UITableViewCell”
  1. giovanni says

    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

  2. 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

Lascia un Commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

*

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">