2013-01-09 9 views
7

Ho uno UITableView su cui sto attivando setEditing:animated:, per consentire all'utente di inserire ed eliminare righe. Quando la modifica è attiva, voglio una nuova riga insert new item da aggiungere alla tabella e quindi voglio che i controlli di modifica si animino come normale. Non voglio che la nuova riga insert new item si animi da sola, usando qualcosa come una dissolvenza. Voglio che appaia e faccia scorrere come tutte le righe delle sorgenti dati della tabella esistenti.Perché setEditing: animated: e insertRowsAtIndexPaths: si traduce in questa strana animazione in stile di modifica?

Ecco ciò che sta accadendo a causa del mio codice corrente, anche se (cliccare per ingrandire):

La riga superiore fa quello che voglio - scivola semplicemente sopra e l'icona si affievolisce di eliminazione Quando scompare, l'icona di eliminazione scompare e la riga si espande nuovamente.

La seconda riga è la mia riga non di origine dati che aggiungo al tavolo. All'apparire, non si anima affatto. L'icona e la riga di inserimento appaiono tutte in una volta e non si inseriscono. Quando scompare, la riga si espande bene, ma l'icona più scorre con essa. L'animazione si sta verificando per l'intera riga e non per l'icona del segno di addizione e quindi fila separatamente, come la prima riga.

Ecco un breve run-down del mio codice, ma penso che fornire un collegamento al file di classe potrebbe essere migliore.

Quando si preme un pulsante di modifica sulla barra degli strumenti, chiamo il metodo setEditing:animated: . In questo metodo, faccio quanto segue ...

- (void)setEditing:(BOOL)editing animated:(BOOL)animated { 

    [super setEditing:editing animated:animated]; 

    // keep the table in the same editing mode 
    [_table setEditing:editing animated:animated]; 

    if (editing) { 

     [_table insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:_channels.count inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; 

    } else { 

     [_table deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:_channels.count inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; 

    } 

} 

Questo è dove si verificano le animazioni di inserimento. Ho provato a completare il tutto in [_table beginUpdate] e endUpdate, oltre all'inserimento delle righe. Né sembra produrre l'animazione pulita che sto puntando.

Qualche idea di cosa potrei mancare? Il file di codice complesso è qui:

https://github.com/ryancole/pound-client/blob/master/pound-client/controllers/ChannelListViewController.m#L106-L127

Grazie

+1

È troppo localizzato? So che c'è un modo per mantenere sincronizzate queste animazioni, perché vedo che altre app lo fanno. – Ryan

+0

prova a spostare [super setEditing: editing animato: animato]; alla fine del metodo setEditing –

+3

+1 per la gif animata! –

risposta

2

La chiamata super-fa lo scorrimento 'per l'editing' animazione in modo se si inserisce qualcosa dopo che, non prendervi parte. Quello che vuoi fare è inserire la riga prima di quella chiamata e rimuovere la riga dopo. Dovrai inoltre tenere traccia delle righe con un altro booleano.

- (void)setEditing:(BOOL)editing animated:(BOOL)animated { 

    _amEditing = editing; 

    if (editing) { 

     [_table insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:_channels.count inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; 

    } 

    [super setEditing:editing animated:animated]; 

    // keep the table in the same editing mode 
    [self.view setEditing:editing animated:animated]; 

    if (!editing) 
    { 
     [_table deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:_channels.count inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; 
    } 


} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return _amEditing ? _channels.count + 1 : _channels.count; 
} 

UPDATE:

Il secondo per l'icona di ultima fila ha ancora una strana animazione .. per ovviare a questo è possibile aggiungere un ritardo per la cancellazione ..

if (!editing) 
    { 
     [self performSelector:@selector(deleteLastRow) withObject:nil afterDelay:0.25]; 
    } 

-(void) deleteLastRow 
{ 
    [self.view deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:_objects.count inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; 
} 
+0

Fantastico, questo è molto vicino! Le celle della tabella si stanno animando correttamente ora e all'unisono.Tuttavia, per qualche motivo, gli identificatori di modifica (le cerchie di aggiunta ed eliminazione) non animano lo stesso. Entrando in modalità di modifica, entrambi si animano correttamente, ma quando si esce dalla modalità di modifica, il cerchio di eliminazione si dissolve (che ritengo sia l'animazione desiderata) mentre il cerchio di addizione si anima facendo scorrere indietro a sinistra fuori dallo schermo come se fosse eseguendo la stessa animazione della cella. Sembra che la correzione sia un aggiustamento a quando vengono chiamate le varie funzioni 'setEditing'. Qualche idea? – Ryan

+0

Per aggiungere ulteriori dettagli, le icone di modifica si animano allo stesso modo della mia GIF animata originale, quando si esce dalla modalità di modifica. Le celle della riga della tabella si animano correttamente, però. – Ryan

+1

Ho contrassegnato questo come risposta, poiché l'animazione sembra correlata tangenzialmente e non direttamente a causa dell'animazione delle celle. Non posso assegnare il premio per altre 5 ore, però. Nel frattempo, parlerò di questo su alcuni forum o qualcosa del genere. – Ryan

1

Come è commentato devi chiamare [super setEditing:editing animated:animated] dopo aver inserito la riga

- (void)setEditing:(BOOL)editing animated:(BOOL)animated { 

    // remove this [super setEditing:editing animated:animated]; 

    // keep the table in the same editing mode 
    [_table setEditing:editing animated:animated]; 

    if (editing) { 

     [_table insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:_channels.count inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; 

    } else { 

     [_table deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:_channels.count inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; 

    } 
    [super setEditing:editing animated:animated]; // add it here 

} 
Problemi correlati