2013-03-20 2 views
6

Ho un UITableViewCell personalizzato (sottoclassato) che contiene alcuni UILabels, un UIButton e un NSBlock come proprietà. Questa sottoclasse è denominata ExploreCell. Due delle proprietà sono UILabels e sono denominati rispettivamente waitLabel e lastUpdateLabel.L'aggiornamento del frame della subview di UITableViewCell non ha alcun effetto

Quando il contenuto di lastUpdateLabel è nullo o è è vuoto cioè @"", devo spostare il waitLabel verticalmente (sull'asse Y) 10 pixel. Lo faccio controllando alcuni oggetti in un NSDictionary come mostrato nel seguente codice che ho inserito nel metodo -tableView:cellForRowAtIndexPath:.

CGRect frame = cell.waitLabel.frame; 

if ([[venue allKeys] containsObject:@"wait_times"] && ([[venue objectForKey:@"wait_times"] count] > 0)) { 

    frame.origin.y = 43; 

} 

else { 
    frame.origin.y = 53; 
} 

[cell.waitLabel setFrame:frame]; 

Tuttavia, questo codice funziona a intermittenza, e dopo aver provato a chiamare -setNeedsLayout, ancora non funziona. A intermittenza, voglio dire che dopo averlo fatto scorrere alcune volte, una o due celle che corrispondono ai criteri per spostare l'origine della cella verso il basso di 10 pixel, hanno effettivamente cambiato il loro frame waitLabel.

Per favore, puoi dirmi perché questo si sta verificando e come può essere risolto.

+0

Dove hai inserito quel codice? – Uby

+0

-cellForRow .... –

+0

Stai utilizzando il layout automatico? – rdelmar

risposta

12

Questo sembra un problema con il layout automatico. Se non l'hai spento esplicitamente, allora è acceso. Dovresti creare uno sbocco per un vincolo in cima (o in fondo) alla cella e cambiare la costante di quel vincolo nel codice piuttosto che impostare i fotogrammi. Secondo i video del WWDC 2012, non dovresti avere alcun setFrame: messaggi nel tuo codice se stai utilizzando il layout automatico.

0

Hai provato in esecuzione

[CATransaction flush]; 
[CATransaction begin]; 

sul thread principale dopo l'aggiornamento di quei valori?

+0

Questo non funziona e non voglio usare un tentativo di hacking per aggirare questo problema. –

+0

Oh, ho appena visto dove lo fai. Non so proprio perché non funziona lì. Leggere velocemente pensava che si trattasse di eseguire azioni sul thread sbagliato. –

-3

È necessario utilizzare [tableView beginUpdates] + [tableView endUpdates] quando si modifica il layout in una delle celle e si desidera che vengano visualizzate immediatamente.

-(void)someMethod 
{ 
    [tableView beginUpdates]; 
    // your code: 
    CGRect frame = cell.waitLabel.frame; 

    if ([[venue allKeys] containsObject:@"wait_times"] && ([[venue objectForKey:@"wait_times"] count] > 0)) 
    { 

     frame.origin.y = 43; 

    } 
    else { 
     frame.origin.y = 53; 
    } 
    [cell.waitLabel setFrame:frame]; 

    [tableView endUpdates]; 
} 

Assicurarsi che [tabelleView beginUpdates] e [tableView endUpdates] si uniscano sempre.

+0

Questo è l'uso non corretto dei metodi -beginUpdates e -endUpdates. Sono specificamente per la gestione di inserimenti batch, aggiornamenti ed eliminazioni di righe. –

+0

@max_ Ho avuto la stessa funzionalità nelle mie celle, dove avevo 3 etichette e 2 di esse sono state spostate e sbiadite in base a qualche valore booleano. Ho aggiunto beginUpdates e endUpdates al mio codice e ha funzionato. Forse è perché hai un UITableViewCell personalizzato – AzaFromKaza

+0

_max ha ragione - cattiva pratica – AlexeyVMP