局部刷新
- (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;
- (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;
- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0);
- (void)insertRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
- (void)deleteRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
- (void)reloadRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0);
蘋果提供了較為豐富的tableView數(shù)據(jù)源操作方法,想必大家早已是信手拈來.
使用這些方法不僅可以精細(xì)的刷新固定的cell,還可以有選擇的使用一些動畫,相較而言,reloadData則暴力直接了許多.
然而,當(dāng)我們使用到這些局部刷新的動畫時,往往可以發(fā)現(xiàn)被刷新的cell會與另一個相同的cell進(jìn)行交替.
當(dāng)執(zhí)行相關(guān)的局部操作時,系統(tǒng)會通過tableView的數(shù)據(jù)源方法來獲取進(jìn)行交替動畫的cell.
此時如果緩存池中匹配的cell數(shù)量不足時,則會根據(jù)cell的
reuseIdentifier
再次創(chuàng)建. 獲取完成后,會將被交替的cell隱藏.
值得注意的是即便使用的動畫枚舉是UITableViewRowAnimationNone
,進(jìn)行交替的cell也依然會被獲取或創(chuàng)建.
如果只用來做普通的數(shù)據(jù)展示,這樣重復(fù)創(chuàng)建倒也沒什么大問題,但是 如果被刷新的cell中有類似播放視頻的功能時,就需要注意,如果你使用的播放器是多例,那么在刷新操作時由于多獲取了一個播放器cell,那么就會導(dǎo)致出現(xiàn)兩個音源的問題.而如果你使用的播放器是單例,那么就需要考慮對于AVPlayerLayer或相關(guān)UI的處理.
- (void)moveSection:(NSInteger)section toSection:(NSInteger)newSection NS_AVAILABLE_IOS(5_0);
- (void)moveRowAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath NS_AVAILABLE_IOS(5_0);
而move相關(guān)的方法,由于本身就是通過已存在或?qū)⒁@示的cell來進(jìn)行交換動畫(縱向),所以不會再特意創(chuàng)建執(zhí)行交替動畫的cell.
關(guān)于局部刷新的動畫.
UITableViewRowAnimation
這個枚舉標(biāo)示了多種動畫樣式,在一般情況下使用相應(yīng)的枚舉值,都會得到我想要的效果.
然而,當(dāng)你使用了UITableViewRowAnimationNone
這個枚舉,并且被刷新的cell有高度和數(shù)量的變化時,這時tableView還是會展現(xiàn)一個動畫效果.
如果你想禁用這種"隱式動畫",可以暫時禁用動畫效果達(dá)到目的.
[UIView setAnimationsEnabled:NO]; // 或者[UIView setAnimationsEnabled:NO];
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
[UIView setAnimationsEnabled:YES]; // 或者[UIView setAnimationsEnabled:YES];
// 批量操作
[CATransaction setDisableActions:YES]; // 或者[UIView setAnimationsEnabled:NO];
[self.tableView beginUpdates];
if (deleIndexPaths.count) {
[self.tableView deleteRowsAtIndexPaths:deleIndexPaths withRowAnimation:UITableViewRowAnimationNone];
}
if (insertArray.count) {
[self.tableView insertRowsAtIndexPaths:insertArray withRowAnimation:UITableViewRowAnimationNone];
}
[self.tableView endUpdates];
[CATransaction setDisableActions:NO]; // 或者[UIView setAnimationsEnabled:YES];