Non voglio l'animazione all'inizio degli aggiornamenti, blocco degli aggiornamenti finali per uitableview?


89

Ho un UITableView che utilizza una cella di tabella personalizzata e ogni cella ha un UIWebView.

Poiché il caricamento di UIWebView ha richiesto molto tempo, voglio evitare di ricaricarli a tutti i costi. In alcune situazioni, ho caricato tutte le celle, ma le loro altezze sono sbagliate. Pertanto, ho bisogno di "relayout" la tabella senza attivare la funzione "cellForRow".

  1. Non posso assolutamente usare reloadData ... poiché ricaricherà di nuovo le celle.
  2. Ho provato tableView.setNeedDisplay, setNeedsLayout ecc, nessuno di loro è in grado di riorganizzare le celle della tabella
  3. L'unico modo in cui ha funzionato è chiamare il blocco beginupdates / endupdates, questo blocco è in grado di ritrasmettere la mia tabella senza attivare cellForRow! MA, non volevo l'animazione! Questo blocco produce un effetto di animazione ma non lo voglio ...

Come posso risolvere il mio problema?

Risposte:


217
[UIView setAnimationsEnabled:NO];
[tableView beginUpdates];
[tableView endUpdates];
[UIView setAnimationsEnabled:YES];

1
È fantastico! Trovo che abbia alcune applicazioni molto interessanti. Ho scoperto che il metodo di ricarica delle sezioni si animerà sempre anche se passi UITableViewRowAnimationNone, ma con questo l'animazione può essere facilmente bypassata!
Flying_Banana

65

Un altro modo per farlo usando i blocchi

Obj-C

[UIView performWithoutAnimation:^{
   [self.tableView beginUpdates];
   [self.tableView endUpdates];
}];

Swift

UIView.performWithoutAnimation {
    tableView.beginUpdates()
    tableView.endUpdates()   
}

4

lavorando sul mio progetto, ma non una soluzione comune.

let loc = tableView.contentOffset
UIView.performWithoutAnimation {

    tableView.reloadData()

    tableView.layoutIfNeeded()
    tableView.beginUpdates()
    tableView.endUpdates()

    tableView.layer.removeAllAnimations()
}
tableView.setContentOffset(loc, animated: true)//animation true may perform better

3

Swifties ho dovuto fare quanto segue per farlo funzionare:

// Sadly, this is not as simple as calling:
//      UIView.setAnimationsEnabled(false)
//      self.tableView.beginUpdates()
//      self.tableView.endUpdates()
//      UIView.setAnimationsEnabled(true)

// We need to disable the animations.
UIView.setAnimationsEnabled(false)
CATransaction.begin()

// And we also need to set the completion block,
CATransaction.setCompletionBlock { () -> Void in
    // of the animation.
    UIView.setAnimationsEnabled(true)
}

// Call the stuff we need to.
self.tableView.beginUpdates()
self.tableView.endUpdates()

// Commit the animation.
CATransaction.commit()

Mi ha aiutato. Grazie. Importante da inserire setAnimationsEnabled(true)nel blocco di completamento.
Lasse Bunk

Ma questo non aggiorna il piè di pagina finché non si scorre la visualizzazione tabella.
Mr. Bean

@ Mr.Bean qual è il caso completo? (cioè la tua tableview ha sempre un piè di pagina, stai cercando di inserirne uno o rimuoverne uno?)
Neil Japhtha

Avere sempre un piè di pagina, solo bisogno di aggiornare il piè di pagina (cioè ci sono 2 visualizzazioni all'interno del piè di pagina, è necessario nascondere / mostrare le visualizzazioni a seconda delle condizioni.)
Mr. Bean

@ Mr.Bean cosa contiene il tuo blocco di aggiornamento? Il metodo più estendibile qui sarebbe ricaricare la sezione.
Neil Japhtha

1

Preferisco avere una transizione graduale:

CGPoint offset = self.tableView.contentOffset;
[UIView transitionWithView:self.tableView duration:0.5 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
        [self.tableView reloadData];
        self.tableView.contentOffset = offset;
    } completion:nil];

Provaci.


0

Volevo aggiornare l'altezza della cella per la sezione 5 e il seguente codice ha funzionato per me:

UiView.setAnimationsEnabled(False)
self.productTableView.reloadSections(NSIndexSet(index: SectionType.ProductDescription.hashValue), withRowAnimation: UITableViewRowAnimation.None)
self.productTableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 5), atScrollPosition: UITableViewScrollPosition.Bottom, animated: false)
UIView.setAnimationsEnabled(true)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.