2014-12-05 7 views
7

Quando si utilizza moveRowAtIndexPath:toIndexPath: per spostare un UITableViewCell, sto vedendo un problema tecnico quando si utilizza un'animazione estimatedRowHeight e UITableViewAutomaticDimension quando la cellula si anima da uno stato visibile a uno stato non visibileUITableViewCell animazione bug in `moveRowAtIndexPath: toIndexPath:` durante l'utilizzo di `` estimatedRowHeight` e UITableViewAutomaticDimension`

Il problema scompare se imposto esplicitamente l'altezza delle celle implementando tableView:heightForRowAtIndexPath:. Il problema viene visualizzato solo quando i percorsi dell'indice di origine e di destinazione sono visibili e non visibili, rispettivamente. Quando la cella si sposta su un altro percorso dell'indice visibile, l'animazione si comporta come previsto.

ho creato un progetto di esempio per illustrare l'effetto: https://github.com/timarnold/Table-Cell-Sizing-Bug

http://www.openradar.me/19156703

Modifica

@rdelmar sottolineato che la mia domanda non chiede in realtà una domanda.

Qualcuno sa un modo per aggirare questo bug e correggere questo comportamento? O sto facendo qualcosa di sbagliato?

Modifica 2014-12-08

ho usato uno dei miei biglietti supporto degli sviluppatori Apple fornite avere informazioni riguardo questo problema con Apple. Hanno confermato che si trattava di un bug (visitare http://www.openradar.me/19156703 per duplicare) e non ha fornito soluzioni alternative.

+0

Sai come risolvere il problema, quindi qual è la tua domanda? Penso che questo sia un caso di "ottieni quello per cui paghi" (la paga è tempo e complessità del codice). Questo, e i problemi con lo scorrimento su un determinato indexPath sono la conseguenza del modo in cui vengono utilizzate le altezze stimolate, quindi non penso che sia possibile correggerlo (sarà interessante vedere se Apple può risolverlo senza sacrificare il vantaggio di velocità di usando altezze stimate). Probabilmente potresti minimizzare l'effetto fornendo una stima più accurata delle tue altezze (sebbene ciò non sia di grande aiuto se hai altezze molto diverse). – rdelmar

+0

Beh, non è tanto una questione in quanto è una documentazione del problema e una richiesta di possibili soluzioni alternative (suppongo che la mia richiesta dovrebbe essere più esplicita, modificherà la domanda). Penso che sia giusto classificare questo comportamento come un bug, tuttavia, dal momento che il progetto da riprodurre è abbastanza semplice e utilizza tutti i componenti e le funzionalità di magazzino. –

+0

Non so se lo definirei un bug, o solo la conseguenza del compromesso tra velocità e correttezza che Apple ha fatto. È una tecnica che funzionerà per alcuni casi, ma non per tutti. Penso che l'unico modo per aggirare sia calcolare le altezze in modo "vecchio stile" - spero di sbagliarmi, perché le nuove celle auto dimensionanti sono grandi quando funzionano. – rdelmar

risposta

-2

Tim,

Questa non è una risposta definitiva, ma alcuni risultati interessanti. Piuttosto che un bug, credo che il comportamento che stai riscontrando sia legato al modo in cui iOS disegna una cella sullo schermo del dispositivo. Più specificamente, alle cellule che sono fuori dallo schermo. Poiché la sorgente dei dati non è influenzata dal riordino delle celle, iOS perde la traccia della posizione della cella.

a fare il mio punto più chiaro che ho fatto le seguenti modifiche al TableViewController.m:

In didSelectRowAtIndexPath

[tableView moveRowAtIndexPath:indexPath 
          toIndexPath:[NSIndexPath indexPathForRow:indexPath.row-3 inSection:indexPath.section]]; 

In cellForRowAtIndexPath

cell.textLabel.text = [NSString stringWithFormat:@"%ld", indexPath.row + 1]; 


Vedrai che le cellule si comportano male solo quando ci si sposta in una posizione esterna alla vista sullo schermo. Inoltre, le celle vengono ridisegnate ogni volta che si sposta lo schermo.

+1

Qual è la differenza tra un "bug" e un "comportamento che stai riscontrando" che non corrisponde al comportamento previsto che la documentazione dice che dovrebbe accadere? –

+0

@AnthonyMattox la tua domanda non è chiara. Non ho mai fatto riferimento a una documentazione. Stavo testando il codice. – carlodurso

0

Provare a memorizzare nella cache le altezze.

private var cellHeights = [NSIndexPath: CGFloat]() 

override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    if let cachedHeight = cellHeights[indexPath] { 
     return cachedHeight 
    } else { 
     return 60 
    } 
} 

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 
    cellHeights[indexPath] = cell.frame.height 
} 
Problemi correlati