2014-12-30 11 views
7

Ho una personalizzazione dinamica UITableViewCell che sfrutta il layout automatico.Approccio preferito per modificare il contenuto di UITableViewCell in base alla larghezza della cella

Varia il contenuto del testo di un'etichetta, a seconda della larghezza della cella.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    ... 
    cell.someLabel.text = CGRectGetWidth(cell.bounds) < 321 ? @"Concise" : @"Much longer blurb"; 

    return cell; 
} 

reloadData è chiamato durante la transizione orientamento di aggiornare l'etichetta.

Mentre funziona, immagino ci sia un modo migliore per gestirlo che non implichi il sovraccarico del ricaricamento di tableView.

(Nessuno dei vincoli devono essere cambiate. L'etichetta è nello stesso posto, ma semplicemente mostra un contenuto diverso, quando non c'è più spazio per lui.)

  • Devo sottoclasse UILabel e modificare il testo in -didMoveToSuperview?

  • È possibile modificare il testo in -layoutSubViews? (Non causerebbe un altro passaggio di layout perché il testo è stato modificato?)

Grazie per eventuali risposte!

+0

"che non comporta il sovraccarico di ricaricare la tableView" Penso che la prima cosa da fare è ripensare il motivo per cui si crede che ricaricare la visualizzazione della tabella è "in testa". È abbastanza efficiente, dal momento che solo i dati della cella della tabella visibile vengono effettivamente recuperati di recente e il modello dei dati dovrebbe essere completamente efficiente o sbagliato. – matt

+0

Sembra eccessivo, Matt. Il layout automatico sta già accadendo, come risultato della rotazione automatica, e suppongo che possa essere gestito proprio all'interno del passaggio del layout che si sta già verificando. Non ne so abbastanza del layout automatico per sapere come la cella o l'etichetta dovrebbero gestirlo. –

+0

Ma il problema che non cito è il sottile sfarfallio della ricarica che non si vedrebbe senza la ricarica. Sarebbe più bello se non avessi dovuto ricaricare la tabella, e si sarebbe semplicemente ruotato automaticamente e ridisegnato da solo (con contenuti diversi). Possibile? –

risposta

4

Aggiungere semplicemente questa logica a layoutSubviews dovrebbe fare il trucco. Si chiama ogni volta che il motore di layout automatico fa il suo dovere.

-(void)layoutSubviews { 
    self.someLabel.text = CGRectGetWidth(self.bounds) < 321 ? @"Concise" : @"Much longer blurb"; 
    [super layoutSubviews]; 
} 
+0

Sto usando '-viewWillTransitionToSize: withTransitionCoordinator:' Mi piacerebbe provare a gestire tutto all'interno del layout automatico (poiché le celle visibili stanno già reagendo alla transizione senza dover ricaricare la tabella). Devo solo scoprire dove effettivamente cambiare il testo. –

+0

Se le cellule visive stanno già reagendo, perché non inserire il cambio di testo ovunque avvenga quella reazione? – Rick

+0

Questo è il mio modo di pensare, ma non so quale metodo inserirmi, e non ho mai armeggiato con '-layoutSubviews' se questo è il metodo giusto per scavalcare. Si tufferà nell'ignoto in pochi giorni e cercherà di scoprire dove dovrebbe accadere il cambio di testo, se nessuno ha questa risposta. –

Problemi correlati