沒有其他機制比指定細胞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
可能是這個興趣,你也許能夠使用的細胞動畫來模擬下面的單元格的運動,以適應您的擴展。
如果您可以放棄爲單元格的框架完全製作動畫,則可以在設置新高度後對已展開的數據執行不透明動畫。
這是一個棘手的問題,但如果你讓它工作,我敢打賭它會很酷。祝你好運。
感謝達尼洛,你讓我開始了正確的道路。我最終通過在didSelectRowAtIndexPath中使用reloadRowsAtIndexPaths來獲得它的工作。我檢查單元格是否展開,並在heightForRowAtIndexPath中設置相應的高度,就像您提到的那樣。再次感謝! – Justin 2009-12-15 01:23:01
太酷了!很高興給你一個有用的推動。希望它能解決問題。也許最近我會嘗試一下自己。 – 2009-12-15 02:58:06
'[indexPath compare:expandedIndexPath] == NSOrderedSame'應寫爲'[indexPath isEqual:expandedIndexPath]' – user102008 2011-01-11 22:59:01