2013-01-22 23 views
8

Sto riscontrando alcuni problemi nell'implementazione di altezze di riga dinamiche in un UITableView - ma non sono le celle con cui sto avendo un problema, è l'UILabel all'interno della cella.UILabel in UITableViewCell con altezza dinamica

La cella contiene solo un UILabel per visualizzare il testo. My tableView: heightForRowAtIndexPath: ridimensiona correttamente ogni cella calcolando l'altezza dell'etichetta che sarà contenuta in essa utilizzando sizeWithFont: method di NSString.

Ho una sottoclasse di UITableViewCell che contiene semplicemente la proprietà UILabel che è collegata nello storyboard. Nello storyboard ho impostato le sue linee su 0, quindi userà tutte le linee di cui ha bisogno, e ho impostato la sua riga Break su Word Wrap.

ecco come lo sono la creazione di cellule:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    ExpandCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

    SomeObject *object = self.tableObjects[index.row]; 

    cell.myLabel.text = [object cellText]; 

    [cell.myLabel sizeToFit]; 

    return cell; 
} 

Quando costruisco questo, ho la mia vista tabella con la cellula del tutto dimensionato alla giusta altezza per il loro contenuto, ma le etichette sono tutti 1 linea che scorre appena fuori dal lato delle celle. Tuttavia, se faccio scorrere il tavolo in modo che cella lasci lo schermo, quindi scorri verso di essi, la loro etichetta verrà ridimensionata correttamente e la cella avrà l'aspetto che mi aspettavo inizialmente.

Ho anche provato a calcolare il frame delle etichette con lo stesso metodo con cui sto calcolando l'altezza della riga, e ottengo lo stesso comportamento: non si disegna correttamente finché non si scorre sullo schermo e si riaccende.

Ho trovato due modi per ovviare a questo problema e nessuna soluzione accettabile.

Primo, se in viewDidAppear: chiamo reloadData sulla mia tableview, le celle e le etichette si disegnano correttamente la prima volta. Ciò non funzionerà per la mia situazione, perché aggiungerò e rimuoverò le celle in questa tabella e non desidero chiamare reloadData ogni volta che viene aggiunta una cella.

La seconda soluzione mi sembra molto strana: se lascio le impostazioni del carattere al Carattere di sistema predefinito 17 su UILabel, le celle si disegnano correttamente. Non appena cambio la dimensione del font, ritorna al suo comportamento di non disegnare correttamente un'etichetta finché non esce dallo schermo e ritorna, o fa chiamare reloadData sul TableView.

Apprezzerei qualsiasi aiuto con questo.

+0

Questo post risponde correttamente il problema: http://stackoverflow.com/questions/8903369/dynamic- UITableViewCell-altezza. Può essere un po 'complicato se non hai mai creato celle dimensionate dinamicamente, ma non è troppo difficile. – macandyp

+0

Non capisco come il codice in quella risposta stia facendo qualcosa di diverso da quello che sto facendo. I AM imposta il frame della mia etichetta in cellForRowAtIndexPath, ma non lo applica fino alla prossima volta che viene ridisegnato. O mi sta sfuggendo qualcosa? – alivingston

+0

Stai implementando heightForRowAtIndexPath? – macandyp

risposta

8

Ho risolto questo problema allocando/iniziando l'etichetta in cellForRowAtIndexPath. Non sono del tutto sicuro del perché questa sia una soluzione, ma sembra che il problema che ho riscontrato abbia a che fare con lo storyboard (o quando, forse?) Crea gli oggetti all'interno della cella. Se alloco/avvio l'etichetta nella cella in cellForRowAtIndexPath, tutto carica e dimensiona correttamente.

Quindi ... la mia correzione attuale è controllare se la cella ha la mia etichetta personalizzata al suo interno. In caso contrario, alloco/inizio l'etichetta e la inserisco nella cella. Se ne ha uno, come in una cella che è stata dequalificata, quindi ho appena impostato il testo nell'etichetta che è già lì.

Non so se è la soluzione migliore, ma funziona per ora.

+0

ho riscontrato un problema simile. L'ho risolto rimuovendo [cell.myLabel sizeToFit] da tableView: cellForRowAtIndexPath :. E poi usando lo storyboard, aggiungi i vincoli Top Space a Superview, Bottom Space a Superview. – jemeshsu

+0

Hai salvato il mio tempo. grazie – NightFury

3

Ho finito per risolvere questo deselezionando la casella di controllo AutoSizing in IB. Non è chiaro il motivo per cui il layout automatico ha causato questo problema.

2

mi sono imbattuto nello stesso problema e ho finiscono per risolverlo chiamando [cell layoutIfNeeded] prima del ritorno della cellula

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
ExpandCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 
SomeObject *object = self.tableObjects[index.row]; 

cell.myLabel.text = [object cellText]; 

[cell layoutIfNeeded]; 

return cell; } 
Problemi correlati