2013-08-22 41 views
2

我期望能夠在保持當前位置的同時展開/收縮UITableView中的所有單元格,並使變化爲高度變化設置動畫。本質上,它應該看起來像當前正在查看的單元格正在展開/收縮,並且滾動位置保持不變。在保持滾動位置的同時動態調整所有UITableViewCell的高度

我能夠擴大/由具有不同高度2點的狀態,並呼籲

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic]; 

聯繫細胞和我試着做,以保持相同的位置(不是100%這個計算是正確的):

 //calculate the new position it should scroll to based on new cell height 
     CGFloat posFromTop = self.tableView.contentOffset.y; 
     CGFloat newDistance = 0; 

      if(expandedState) 
      { 
       CGFloat cellsFromTop = posFromTop/kExpandedCellHeight; 
       newDistance = cellsFromTop * kCollapsedCellHeight; 
      } 
      else 
      { 
       CGFloat cellsFromTop = posFromTop/kMGLCollapsedCellHeight; 
       newDistance = cellsFromTop * kMGLExpandedCellHeight; 
      } 
     } 

//reload section 
     [self.tableView setContentOffset:CGPointMake(0, newDistance) animated:YES]; 
     [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic]; 

雖然這似乎是一種工作,它不保存位置,因爲它動畫,閃白,所以它的震盪並不會看起來像的tableView被重新加載期間繼續留。

任何人都有一種方法,可以在保持相同位置的同時平滑動畫所有單元格的高度?

+1

您是否找到解決方案? – sim

回答

0

您可能會發現執行第一個摺疊動畫需要多少時間,假設它需要1秒。然後,我想你就可以說是這樣的:

[UIView animateWithDuration:1.0 animations:^{ 
    [self.tableView setContentOffset:CGPointMake(0, newDistance) animated:NO]; 
}]; 

這將超過1秒,在您的tableView開始於當前contentOffset,並與你想要的contentOffset最終執行的動畫。我從來沒有使用過UITableViewRowAnimationAutomatic或動畫tableview,但也許你可以嘗試一些其他的值。

實際上,如果你知道我的意思,你可能可以將這兩個動作都放到同一個動畫中。這也可以讓你控制一切的持續時間。我不知道這是否會工作,我現在不能測試它,但是這將是這個樣子:

[UIView animateWithDuration:1.0 animations:^{ 
    [self.tableView setContentOffset:CGPointMake(0, newDistance) animated:NO]; 
    [self.tableView setRowHeight:newHeight]; 
}]; 

我懷疑特定的方法確實存在,但我敢肯定你我在說什麼,如果有類似的東西會發現它。甚至可以在原始調用中使用nil作爲動畫參數。

(還有一種叫beginUpdatesendUpdates你可以看看,如果這是行不通的,但我不知道,可以改變高度)

+0

我試着用動畫UIView,但沒有退出工作,同時轉換高度。雖然這是一個很好的想法。 – user1218464

+0

@ user1218464您是否嘗試了第二個想法,在同一個動畫序列中爲動畫和高度動畫?不只是高度? – Sti

+0

沒有'setRowHeight'或類似的表格。所以你必須開始更新/結束更新或重新加載表格/部分以調整高度。所以它不可能(所以看起來)把它放在動畫中。 – user1218464

2

嘗試用

更換

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation: UITableViewRowAnimationAutomatic]; 

[self.tableView beginUpdates]; 
[self.tableView endUpdates]; 

後者將採取當前單元格並更新其大小。使用自動動畫重新加載片段可能會使用淡出動畫,在新高度處生成新單元格,並在現有和新的單元格之間淡入淡出,這可能不是您想要的。

+0

開始/結束更新似乎有助於轉換,但仍然不是很流暢,因爲仍然存在將表保存在同一個地方的問題。 – user1218464

+0

嘗試在表視圖更新後放置'setContentOffset:'調用。問題可能是在設置內容偏移量後表格正在更新其內容大小,因此它實際上並未正確保留。 – ianyh