2009-12-14 124 views
5

可能重複:
Can you animate a height change on a UITableViewCell when selected?動畫的UITableViewCell高度

我一直在做谷歌搜索,試圖找出這樣做的正確方法很多,到目前爲止我很茫然。

我已經用我自己的視圖對UITableViewCell進行了子類化,我試圖在UITableViewCell被選中時展開的高度以及當它再次被選中時展開。此表有可能包含數千行,所以我不想覆蓋tableView的heightForRowAtIndexPath。理想情況下,我希望能夠一次擴展一個以上的單元格,但這並不重要。做這個的最好方式是什麼?

謝謝 賈斯汀

回答

6

沒有其他機制比指定細胞heightForRowAtIndexPath高度。除非您在該方法中正確計算擴展的單元格,否則您會發現其他單元或者在其上運行或隱藏在其下。從忘記設置heightForRowAtIndexPath的boneheaded代碼,我很確定您的其他單元格將顯示在其上。

由於您正在談論數千行,因此我們假定用戶無法重新排列單元格。

當用戶點擊給定單元格時,您可以做的是存儲擴展單元格的索引路徑。然後,heightForRowAtIndexPath可能是這樣的:

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

if ([indexPath isEqual:lastSelectedIndexPath]) 
{ 
    return 80; 
} 

else { 
    return 44; 
} 

} 

如果你真的想多個選擇,你可以在適當的索引路徑存儲到一個數組中,並檢查他們是這樣的:

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

CGFloat cellHeight = 44; 

for (NSIndexPath *expandedIndexPath in expandedIndexPathsArray) 
{ 
    if ([indexPath compare:expandedIndexPath] == NSOrderedSame) 
    { 
     cellHeight = 80; 
     break; 
    } 
} 

return cellHeight; 

} 

獲取動畫看起來正確會需要一些工作。我已經玩弄了這個特定的用戶界面想法一段時間,永遠不會讓自己坐下來,真正實現它。你可以做的一件事是顯示一個虛擬視圖,在更新其後面的tableview的同時顯示動畫。

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPathswithRowAnimation:(UITableViewRowAnimation)animation 

可能是這個興趣,你也許能夠使用的細胞動畫來模擬下面的單元格的運動,以適應您的擴展。

如果您可以放棄爲單元格的框架完全製作動畫,則可以在設置新高度後對已展開的數據執行不透明動畫。

這是一個棘手的問題,但如果你讓它工作,我敢打賭它會很酷。祝你好運。

+1

感謝達尼洛,你讓我開始了正確的道路。我最終通過在didSelectRowAtIndexPath中使用reloadRowsAtIndexPaths來獲得它的工作。我檢查單元格是否展開,並在heightForRowAtIndexPath中設置相應的高度,就像您提到的那樣。再次感謝! – Justin 2009-12-15 01:23:01

+1

太酷了!很高興給你一個有用的推動。希望它能解決問題。也許最近我會嘗試一下自己。 – 2009-12-15 02:58:06

+1

'[indexPath compare:expandedIndexPath] == NSOrderedSame'應寫爲'[indexPath isEqual:expandedIndexPath]' – user102008 2011-01-11 22:59:01