2012-04-17 53 views
7

我有一個普通的UITableView,有4行,每個高度爲50.當按第四行時,我插入第五行,高度爲80使用UITableViewRowAnimationTop。到現在爲止還挺好。當刪除一個單元格的高度大於其他單元格時,動畫看起來很尷尬

我想再次按下第四行時刪除第五行。但是,當我使用UITableViewRowAnimationTop(或其他任何動畫樣式)刪除該行時,動畫看起來非常尷尬 - 動畫開始,但在動畫完成之前單元格突然消失。 (這隻有在使用具有背景顏色的單元格時才顯而易見,您可以看到單元格的下半部分突然消失而不是消失在其上方的單元格下方。)

代碼如下所示:

[self.tableview beginupdates]; 
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop]; 
[self.tableview endupdates]; 

行高由tableView:heightForRowAtIndexPath:方法提供。

當所有行具有相同的高度,或者當被刪除的行比其他行短時,不會發生此問題。

我認爲一個解決方法是刪除它之前改變第五單元50的高度,但我寧願不做that.Please幫助

回答

0

你試過這樣做沒有開始/ endUpdates?我隱約記得使用那些讓事情變得奇怪的事情。

您是否嘗試過爲下一個行做reloadRowsAtIndexPaths:?假設有一個,就是這樣。

您確定數據源在您進行deleteRowsAt調用的位置的heightForRow響應方面的行爲是否正確? (例如,你可以設置一些標誌來指示在刪除調用之後該東西不再可見,這可能導致新行具有不好的高度)

1

我今天早上剛碰到這個問題。基本上,我最終自己處理動畫,然後在動畫完成後刪除單元格。下面是一些代碼,以顯示我是怎麼做的:

@property (nonatomic, strong) NSArray *tableData; 
@property (nonatomic, strong) NSMutableDictionary *deletedItems; 
... 

- (void)deleteItemForCell:(UITableViewCell *)cell 
{ 
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 
    NSObject *item = self.tableData[indexPath.row]; 

    NSNumber *rowKey = @(indexPath.row); 

    __weak id weakSelf = self; 
    [CATransaction setCompletionBlock:^{ 
     @synchronized(weakSelf) { 
      [self.deletedItems removeObjectForKey:rowKey]; 
      [self.tableData removeObject:item]; 
      [self.tableView deleteRowsAtIndexPaths:@[indexPath] 
            withRowAnimation:UITableViewRowAnimationNone]; 
     } 
    }]; 
    self.deletedItems[rowKey] = item; 

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

    [CATransaction commit]; 
} 

- (CGFloat)tableView:(UITableView *)tableView 
    heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (self.deletedItem[@(indexPath.row)]) { 
     return 0; 
    } 
    return CELL_HEIGHT; 
} 

代碼軌道已刪除的數據結構中的項目,並通知表進行更新。刪除數據結構中的任何項目都會得到0的高度,這將導致「崩潰」動畫。

該代碼利用CATransaction知道動畫何時完成。一旦完成,該項目將從tableData數據結構中刪除並從表格中刪除,而不需要任何動畫。

注:

  • 我不知道是否需要同步,但似乎聰明有,因爲我們正在處理異步刪除項目。
  • 我試圖使用indexPath對象作爲字典的關鍵,但它似乎沒有工作。用來代替。

希望這會有所幫助。

1

使用UITableViewRowAnimationMiddle使它對我來說稍微不太可怕。

同樣,我注意到,與UITableViewRowAnimationTop超過桌面默認單元格高度的高度出現/消失,沒有動畫。所以,如果你的tableview行的高度是44,但您在單元格動畫與74的高度,它會立即顯示 30,然後在剩下的44

隨着UITableViewRowAnimationMiddle單元格內容很好的動畫在製作動畫,但細胞邊界在動畫的持續時間內出現毛刺 - 最初出現在30處,然後動畫化剩餘的44處。

+0

這裏我們是在2017年,這個問題仍然存在tableWiews中。 「Middle」確實使內容的動畫效果比「Top」更健全。 – DanBlakemore 2017-03-01 17:37:30

相關問題