6

Ho una cella di visualizzazione tabella personalizzata che utilizza il layout automatico e ha un indicatore di divulgazione come vista accessoria. La dimensione cellulare delle cellule sullo schermo sono completamente sbagliato quando visualizzato prima:UITableViewCell personalizzato con visualizzazione automatica del layout e degli accessori

Come si può vedere la cella sta prendendo circa un 1,5 schermate di spazio:

enter image description here

Tuttavia, se ruoto il dispositivo e ruotare di nuovo si guarda bene:

enter image description here

Come si può vedere qui, ho fatto nulla di complicato:

enter image description here

ho una soluzione molto non ideale, che è quello di fare:

-(void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    [self.tableView reloadData]; 
} 

Ma che provoca ovviamente un 'flash' la prima volta che vedi sullo schermo. In uno scenario più complicato il flash è molto più ovvio.

ho un'altra soluzione, ma questo provoca un'eccezione Layout Automatico:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    BasicCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BasicCell" forIndexPath:indexPath]; 
    cell.basicLabel.text = @"Hello this is just some text that should get the label to go over multiple lines"; 
    [cell.basicLabel layoutIfNeeded]; 
    return cell; 
} 

Eccezione:

enter image description here

Almeno questo metodo non mi danno UI lampeggiante.

Se rimuovo la vista accessoria, funziona perfettamente.

UPDATE: Ho aggiunto un progetto di esempio per GitHub: https://github.com/fwaddle/TableCellAccessoryTest

UPDATE # 2: Si scopre che un altro ovviare a questo problema è di layout la cella in codice. Ho appena provato a fare la stessa cosa nel codice e non ha lanciato l'avviso e ha funzionato bene. Sembra un bug IB.

Qualche idea su come aggirare questo problema? Grazie.

+0

Imposta i tuoi vincoli correttamente all'interno della tua cella, che a volte può essere complicato, quindi imposta la proprietà 'rowHeight' sulla tua vista tabella su' UITableViewAutomaticDimension'. Inoltre non è un'eccezione, è un avvertimento per l'errata configurazione. Un'eccezione non risolta interromperà l'applicazione. – Michael

+0

Ciao @Nikita, I vincoli sono impostati correttamente e ho impostato correttamente il valore rowHeight: - (void) viewDidLoad { [super viewDidLoad]; self.tableView.rowHeight = UITableViewAutomaticDimension; self.tableView.estimatedRowHeight = 45; } Ma io sostengo che non si tratta di un'eccezione. – Mof

+0

Penso che questo sia un problema con i tuoi vincoli. Pulisci la tua build e rimuovi i vincoli che non vengono utilizzati nel layout, quindi crea ed esegui. – Michael

risposta

0

Quindi, anche la creazione di vincoli di codice a volte non risolve questo problema. Sembra che tu abbia bisogno di qualche altro cambiamento. Nella tua cella tabella personalizzata aggiungere la seguente specialmente se si sta cambiando il tipo di accessorio a seconda del contenuto della cella (ad es segno di spunta):

-(void) setAccessoryType:(UITableViewCellAccessoryType)accessoryType { 
    [super setAccessoryType:accessoryType]; 
    [self setNeedsUpdateConstraints]; 
} 

Rimuovere anche il prototipo di cella nello storyboard e registrare la vostra classe, invece:

-(void) viewDidLoad { 
    [super viewDidLoad]; 
    [self.tableView registerClass:[MyCustomCell class] forCellReuseIdentifier:@"MyCustomCell"]; 
} 

tanto in tanto trovo che ho ancora bisogno di forzare le etichette (in particolare multi-linea di etichette a quanto pare) di ri layout in cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCustomCell" forIndexPath:indexPath]; 
    cell.customLabel.text = ..... 
    [cell.customLabel layoutIfNeeded]; 
    return cell; 
} 

Tutto quanto sopra ha risolto i miei problemi, quindi spero che siano utili per gli altri e non ci si perde una grande quantità di tempo su questo.

Non ho ancora ricevuto risposta da Apple sul bug report, ma presumo che sia abbastanza normale.

3

Implementare il seguente metodo delegato in quanto questo ha risolto il problema per me.

- (void)tableView:(UITableView *)tableView 
willDisplayCell:(UITableViewCell *)cell 
forRowAtIndexPath:(NSIndexPath*)indexPath 

Una vista tabella invia questo messaggio al suo delegato appena prima che utilizza cella per disegnare una riga, permettendo così il delegato per personalizzare l'oggetto cella prima di essere visualizzato. Questo metodo offre al delegato la possibilità di sovrascrivere le proprietà basate sullo stato impostate in precedenza dalla vista tabella , ad esempio la selezione e il colore di sfondo. Dopo la restituzione del delegato , la vista tabella imposta solo le proprietà alfa e frame e solo quando si animano le righe mentre si inseriscono o si inseriscono.

Aggiungi questo codice al tableViewController:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{ 

    BasicCell *basicCell = (BasicCell *)cell; 
    basicCell.basicLabel.text = @"Hello this is just some text that should get the label to go over multiple lines"; 

} 
+0

Sebbene la tua soluzione sia il miglior lavoro finora, non è ancora perfetta. La tua soluzione produce ancora celle troppo alte. Dai un'occhiata a cosa succede quando ruoti il ​​dispositivo in senso orario e poi indietro. Noterai che le celle diventano più piccole e più piccole alla giusta altezza. Ho anche presentato una segnalazione di bug con Apple in quanto sembra un bug di iOS. – Mof