2014-10-12 6 views
9

Ho statico UITableView con celle stile di base, altezza 44 predefinita. C'è un'etichetta in ogni cella con lo stile di testo Corpo. In questo modo sto ottenendo il comportamento di tipo dinamico gratuitamente.UILabel scompare da UITableViewCell statico con tipo dinamico

Funziona a meno che:

  1. Aprire app
  2. Aprire la tabella vista
  3. Aprire Impostazioni ang cambio formato testo (più grande del più piccolo) di nuovo
  4. Aperto app, etichette di fuga.
  5. Vai a un'altra vista (retro) e aprire di nuovo tavolo travagliata - testo modificato e sembra buono

sono riuscito a risolvere il problema con un trucco

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(preferredContentSizeChanged) 
               name:UIContentSizeCategoryDidChangeNotification object:nil]; 
} 

- (void)preferredContentSizeChanged 
{ 
    // adjust the layout of the cells 
    // for some reason text from labels are disappear 
    self.statusBarCell.textLabel.text = @"Status bar"; 
    self.itemColorCell.textLabel.text = @"Color"; 

Ma ho un altro esattamente lo stesso UITableView e questo non funziona. Ho provato prese per celle ed etichette. Ho provato i metodi reloadData e setNeedsLayout.

Ecco le immagini. Le etichette sono giallo e visualizzare il contenuto è blu:

Before, cells with content After, cells without labels

risposta

2

ho cambiato tabella in un dinamico e attuato cellForRowAtIndexPath: metodo per assegnare un'etichetta tavolo nel codice. Questo non mi ha aiutato.

Successivo Ho cambiato lo stile di cella visualizzazione tabella da di base a personalizzato. Ho dovuto aggiungere la mia etichetta e impostare i vincoli AutoLayout in Storyboard. Questo è risolto il problema. La notifica preferredContentSizeChanged non è necessaria.

Nel mio cellForRowAtIndexPath:

cell.label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; 

ho archivierà un radar di Apple in seguito. Sembra che non possiamo usare il tipo dinamico con tabelle statiche.

Buona fortuna e si prega di implementare il tipo dinamico nelle tue app. Ne vale la pena.

4

Recentemente ho giocato con tabelle statiche e ho provato ad aggiungere un tipo dinamico. Ho ottenuto gli stessi risultati di te - si può persino vedere questa etichetta scomparsa in Contatti.app di Apple.

Anche dopo aver modificato la tabella da statica a dinamica e implementando una piccola cella personalizzata contenente una UILabel (configurata con font come UIFontTextStyleBody nella XIB), la tabella non sembrava ancora aggiornare il suo contenuto quando si modificava la dimensione del testo preferita in sistema prefrenze.

Comunque: ho ottenuto accidentalmente alcuni risultati dopo aver fatto il seguente: nella sottoclasse per la mia cella personalizzato ho implementato prepareForReuse e ri-inizializzare carattere dell'etichetta per il corretto stile:

- (void)prepareForReuse { 

    self.label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; 
} 

Con l'hack sopra la mia le celle di tabella adattano i loro caratteri in modo dinamico ai cambiamenti nelle preferenze di sistema.

Spero che questo aiuti.

+0

Grazie per la condivisione, l'ho provato sul mio altro tavolo statico e non ha aiutato. Devo ancora ricreare il testo delle etichette sulla notifica 'preferredContentSizeChanged'. –

+0

No, la mia "soluzione" di cui sopra non funziona con tabelle statiche, ma penso che internamente il problema sia lo stesso: le etichette nelle celle non si aggiornano correttamente ai nuovi font - probabilmente perché c'è troppa cache in corso . – mschmidt

+0

Vedo che nella mia risposta sto facendo la stessa riga di codice. Lo faccio solo nel metodo 'cellForRowAtIndexPath' di' UITableViewController'. –

1

Prova ad aggiungere [self.table reloadData]; nel tuo metodo preferredContentSizeChanged.

+0

Upvoted per errore (e non può downvote). Non funziona –

0

Nella mia esperienza, si tratta di un problema di Storyboard con lo stile tableClassCell 'basic'. Quando viene ricevuto un UIContentSizeCategoryDidChangeNotification, gli attributi per il textLabel impostati in Storyboard sono "dimenticati", incluso il testo stesso. Ho risolto un problema simile impostando invece gli attributi textLabel necessari nel codice (in CellForRowAtIndexPath).

0

L'etichetta viene eliminata dalla visualizzazione padre. Prova questo:

override func prepareForReuse() { 
    super.prepareForReuse() 
    contentView.addSubview(unitLabel) 
} 
1

Se si stavano collegando l'uscita di textLabel, detailTextLabel da soli, di cancellare l'uscita. e userete le proprietà di UITableViewCell.

open class UITableViewCell { 
    open var textLabel: UILabel? { get }  
    open var detailTextLabel: UILabel? { get } 
0

Ho avuto lo stesso problema e ha voluto risolvere questo senza codice. Così ho cambiato

  • il tipo di cellula statica da quella di base al costume,
  • aggiunto la mia etichetta
  • aggiunto iniziali, finali e dei vincoli centro verticale,
  • impostare la casella Tipo di controllo dinamico in etichetta per su
  • e il carattere dell'etichetta sul corpo degli stili di testo. -

Questo funziona anche per le viste di tabella che non hanno un codice di programma/classe