2012-02-16 12 views
65

Mam UITableView. Używa niestandardowej komórki tabeli, a każda komórka ma widok interfejsu użytkownika. Bcoz UIWebView zabrał czas, aby załadować, chcę uniknąć przeładowania ich za wszelką cenę. W niektórych sytuacjach mam załadowane wszystkie komórki, ale ich wysokość jest pomieszana. Dlatego potrzebuję "przekazać" tabelę bez wywoływania funkcji "cellForRow".Nie chcę animacji na początku aktualizacji, blokowanie aktualizacji dla uitableview?

  1. Zdecydowanie nie mogę użyć polecenia reloadData ... ponieważ spowoduje to ponowne załadowanie komórek.
  2. Próbowałem tableView.setNeedDisplay, setNeedsLayout itp, żaden z nich nie jest w stanie zmienić komórki tabeli
  3. Jedyny sposób to działało, to zadzwonić beginupdates/endupdates blok, to blok jest w stanie relayout mój stół bez wypalania cellForRow ! ALE, nie chciałem animacji! Ten blok daje efekt animacji, ale nie chcę tego ...

Jak mogę rozwiązać mój problem?

Odpowiedz

182
[UIView setAnimationsEnabled:NO]; 
[tableView beginUpdates]; 
[tableView endUpdates]; 
[UIView setAnimationsEnabled:YES]; 
+1

To sprytna, sprytna sztuczka. Dodam to do mojego zestawu narzędzi! –

+1

To jest świetne! Uważam, że ma kilka najciekawszych aplikacji. Zauważyłem, że metoda przeładowywania sekcji zawsze będzie animowana nawet jeśli przekażesz '' 'UITableViewRowAnimationNone''', ale dzięki temu animację można łatwo ominąć! –

+1

Woow! Jesteś szefem, człowieku! – debiasej

2

Swifties musiałem wykonać następujące czynności, aby to zadziałało:

// 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() 
+0

Pomógł mi. Dzięki. Ważne, aby wstawić 'setAnimationsEnabled (true)' wewnątrz bloku zakończenia. –

+0

Ale to nie aktualizuje stopki, dopóki nie przewiniesz widoku tabeli. –

+0

@ Mr.Bean jaki jest pełny przypadek? (Czy twój tableview zawsze ma stopkę, czy próbujesz wstawić jedną czy usunąć?) – NeilJaff

37

jeden sposób, aby to zrobić za pomocą bloków

obj-C

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

Swift

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

Chciałem zaktualizowanej wysokości komórek do sekcji 5 i następujący kod pracował dla mnie:

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) 
1

wolę mieć płynne przejście:

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

dać to próba.

Powiązane problemy