2011-06-11 66 views
0

我想實現擴展UITableViewCells我完全控制從摺疊到展開和返回的過渡動畫。 我有一個數組,cellDataList,持有的我UITableViewCells的狀態,即heightcolordataisExpanded更多控制更新UITableView和UITableViewCell

我實現:

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 

    if (indexPath == selectedIndex) 
     return expandedHeight; 
    return collapsedHeight; 

} 

和我實現:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    /* 
    some logic that tests if the indexPath is already selected, 
    which will collapse the cell, if a previous cell needs to be collapsed before the 
    new expands etc. 
    */ 

    [tableView beginUpdates]; 
    [tableView reloadRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationNone]; 
    [tableView endUpdates]; 
} 

我的手機是一個自定義UITableViewCell我在那裏建立我的內容drawRect: cell有一個UIView(背景),用作單元格的自定義背景,我希望這個視圖可以
將動畫從摺疊到展開和返回,而不僅僅是一個「跳躍」中的setFrame,就像現在一樣。

我真的不知道在哪裏'截取'tableView更新鏈,來實現這一點。

當我做了上面的[tableView beginUpdates] - [tableView endUpdates],它開始變得模糊不清。 我認爲

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

被稱爲更新細胞 在指定的索引。這又會詢問heightForCellAtIndexPath哪個高度來設置單元格。如果我在定製單元設置一個斷點setFrame:方法 我可以看到來電是

[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:](). 

此設置單元格的新幀,那麼我想[cell setNeedsDisplay]以某種方式調用,所以電池可以使所提供的框架。 [cell setNeedsDisplay]最終會調用我的自定義drawRect:並呈現單元格的內容。這個按預期工作,但我不知道在哪裏以及如何爲我的背景設置動畫框架,也是以某種方式進行動畫,所以只有在單擊時纔會完成,並且不是每次調用setFrame:(在滾動等過程中)。 當我做了上面的tableView動畫,爲新的單元格大小騰出空間,這是我想用我的單元格上的背景視圖「模仿」這個動畫的 。

我在Tweetbot和路徑等應用程序中看到了這種效果,但似乎無法複製它。

希望有人可以幫助我在正確的方向,謝謝:)

回答

0

我不能完全確定,我理解你的問題正是:)但是你可以使用密鑰值觀察(志願)來檢查當您需要玩你的動畫,然後調用你的表重載方法。

- (void)reloadTable 
{ 

if (self.isViewLoaded) { 
    [self.tableView reloadData]; 
} 

}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
[self reloadTable]; 
} 
+0

感謝你,真的很短的版本是「有沒有一種方法來創建一個uitableviewcells高度的動畫,這樣它就可以與uitableviews動畫同步,在它旁邊移動,爲一個新大小的單元騰出空間」。你提供的代碼在哪裏去?控制器,customcell或tableview? – RickiG 2011-06-12 09:07:23

+0

你應該在tableView中動態改變你的單元格的高度,但是之後你需要重新加載你的表格。嘗試調試您的代碼以檢查它是否涉及到您的新高度值。但是,一旦不改變這一點,你就編寫自定義單元格。在您的控制器部件中,訪問您的自定義單元並更改其高度,然後重新加載表格。 – 2011-06-12 11:05:12

0

做到這一點,最好的方法是補充,被竊聽下面的單元格虛設單元。我向你解釋這個祕密here

基本上是:

  1. 什麼細胞的跟蹤都被竊聽你的didSelectRowAtIndexPath並適當地更新。哪一個需要刪除?下一個新的虛擬細胞在哪裏?
  2. 每當存在虛擬單元格時都返回正確的帳戶。
  3. 考慮到虛擬單元不屬於您的模型。抵消indexPath