2012-02-16 61 views
65

我有一個UITableView。 它使用自定義表格單元格,每個單元格都有一個uiwebview。 Bcoz UIWebView花費時間加載,我想避免不惜一切代價重新加載它們。 在某些情況下,我已加載所有單元格,但其高度已混亂。 因此,我需要「重新佈局」表格而不觸發「cellForRow」功能。我不想在開始更新動畫,結束更新塊爲uitableview?

  1. 我絕對不能使用reloadData ...因爲它會重新加載單元格。
  2. 我試過tableView.setNeedDisplay,setNeedsLayout等,他們都不是能夠重新排列表格單元格
  3. 只是它的工作方式,是調用beginupdates/endupdates塊,該塊能夠重新佈局我的表兵不血刃cellForRow !但是,我不想動畫!此塊產生動畫效果,但我不想要它...

我該如何解決我的問題?

回答

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

這是一個聰明,聰明的把戲。我會將其添加到我的工具箱中! – 2015-02-06 22:57:03

+1

這太棒了!我發現它有一些最有趣的應用程序。我發現即使你傳入'''UITableViewRowAnimationNone''',reload部分的方法總是會動畫的,但是動畫可以很容易的繞過! – 2015-04-21 15:11:42

+1

Woow!你是老闆,老兄! – debiasej 2015-10-30 11:17:12

2

Swifties 我不得不做以下這個工作:

// 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

幫助了我。謝謝。重要的是在完成塊中放置'setAnimationsEnabled(true)'。 – 2016-05-25 15:02:39

+0

但是,這不會更新頁腳,直到你滾動tableview。 – 2017-11-30 05:46:04

+0

@Bean先生,這是什麼情況? (即你的桌面視圖總是有一個頁腳,你想插入一個或刪除一個?) – NeilJaff 2017-12-04 11:25:02

37

使用塊

對象 -

[UIView performWithoutAnimation:^{ 
    [self.tableView beginUpdates]; 
    [self.tableView endUpdates]; 
}]; 
另一種方式

斯威夫特

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

我想更新單元格高度爲第5和下面的代碼爲我工作:

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

我希望有一個平穩過渡:

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

給予它是一個嘗試。