2013-01-09 95 views
7

我有一個UITableView,我在上面打開setEditing:animated:,以允許用戶插入和刪除行。當編輯處於打開狀態時,我想要將一個新的insert new item行添加到表格中,然後我想讓編輯控件以類似於正常的方式進行動畫製作。我不希望新的insert new item行自己動起來,使用類似淡入淡出的東西。我希望它剛剛出現,然後像任何現有的表格數據源行一樣滑入。爲什麼setEditing:animated:和insertRowsAtIndexPaths:導致這種奇怪的編輯風格動畫?

這裏是正在發生的事情爲我當前的代碼的結果,但(點擊查看大圖):

頂行我想要做什麼 - 它只是滑過和刪除圖標變淡當它消失時,刪除圖標淡出並且該行再次展開。

第二行是我自己添加到表格中的非數據源行。出現時,它根本不具有動畫效果。插入圖標和行同時出現,不會滑入。當它消失時,該行很好地展開,但加號圖標隨其滑動。動畫發生在整行,而不是加號圖標,然後單獨行,就像第一行一樣。

下面是我的代碼的一個快速運行,但我認爲提供到類文件的鏈接可能會更好。

當我按下工具欄上的編輯按鈕時,我打電話給我的UIViewController方法setEditing:animated:。在這種方法中,我執行以下操作...

- (void)setEditing:(BOOL)editing animated:(BOOL)animated { 

    [super setEditing:editing animated:animated]; 

    // keep the table in the same editing mode 
    [_table setEditing:editing animated:animated]; 

    if (editing) { 

     [_table insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:_channels.count inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; 

    } else { 

     [_table deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:_channels.count inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; 

    } 

} 

這是插入的動畫出現的位置。我嘗試在[_table beginUpdate]和endUpdate中包裝整個事物,以及僅插入行。這兩者似乎都沒有產生我打算乾淨的動畫。

任何想法可能會失蹤?整個代碼文件是在這裏:

https://github.com/ryancole/pound-client/blob/master/pound-client/controllers/ChannelListViewController.m#L106-L127

感謝

+1

這是否太本地化?我知道有一種方法可以讓這些動畫保持同步,因爲我看到其他應用可以執行此操作。 – Ryan

+0

嘗試移動[super setEditing:編輯動畫:動畫];在您的setEditing方法的末尾 –

+3

爲動畫GIF! –

回答

2

超級調用將滑「到編輯」的動畫,所以如果你在其後插入的東西,它不會在它參與。你想要做的是在該調用之前插入該行,然後刪除該行。您還需要跟蹤具有不同布爾值的行。

- (void)setEditing:(BOOL)editing animated:(BOOL)animated { 

    _amEditing = editing; 

    if (editing) { 

     [_table insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:_channels.count inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; 

    } 

    [super setEditing:editing animated:animated]; 

    // keep the table in the same editing mode 
    [self.view setEditing:editing animated:animated]; 

    if (!editing) 
    { 
     [_table deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:_channels.count inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; 
    } 


} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return _amEditing ? _channels.count + 1 : _channels.count; 
} 

UPDATE:

倒數第二排的圖標仍然有一個奇怪的動畫。要解決這個你可以延遲添加到刪除..

if (!editing) 
    { 
     [self performSelector:@selector(deleteLastRow) withObject:nil afterDelay:0.25]; 
    } 

-(void) deleteLastRow 
{ 
    [self.view deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:_objects.count inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; 
} 
+0

太棒了,這非常接近!表格單元格現在正確地動畫,並且一致。但出於某種原因,編輯標識符(添加和刪除圓圈)的動畫效果不一樣。進入編輯模式時,它們都可以正常動畫,但是當離開編輯模式時,刪除圓形排序就會淡出(我認爲是預期的動畫),而添加圓形則是通過從屏幕左側滑出來進行動畫,就好像它是執行與單元格相同的動畫。看起來修復將是對各種'setEditing'函數被調用時的調整。有任何想法嗎? – Ryan

+0

要添加更多詳細信息,編輯圖標在離開編輯模式時的動畫方式與我原始的動畫GIF中的動畫相同。儘管如此,表格行單元格的動畫效果卻不錯。 – Ryan

+1

我已經將此標記爲答案,因爲動畫似乎與切線相關,而不是直接由於細胞動畫。不過,我無法再給予獎勵5個小時。與此同時,我會在一些論壇上發佈這方面的信息。 – Ryan

1

正如評論您必須在插入該行後調用[super setEditing:editing animated:animated]

- (void)setEditing:(BOOL)editing animated:(BOOL)animated { 

    // remove this [super setEditing:editing animated:animated]; 

    // keep the table in the same editing mode 
    [_table setEditing:editing animated:animated]; 

    if (editing) { 

     [_table insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:_channels.count inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; 

    } else { 

     [_table deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:_channels.count inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; 

    } 
    [super setEditing:editing animated:animated]; // add it here 

} 
相關問題