From 1530ef2841b71b56f377d822bbba280d16631098 Mon Sep 17 00:00:00 2001 From: Levi McCallum Date: Thu, 7 May 2015 21:53:38 -0700 Subject: [PATCH] Prevent UITableView insertion/deletion animations by default Fixes #292 --- AsyncDisplayKit/ASCollectionView.mm | 2 +- AsyncDisplayKit/ASTableView.mm | 27 ++++++++++++++++++++++----- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/AsyncDisplayKit/ASCollectionView.mm b/AsyncDisplayKit/ASCollectionView.mm index 04200238bf..0583ae3b28 100644 --- a/AsyncDisplayKit/ASCollectionView.mm +++ b/AsyncDisplayKit/ASCollectionView.mm @@ -15,7 +15,7 @@ #import "ASDisplayNodeInternal.h" #import "ASBatchFetching.h" -const static NSUInteger kASCollectionViewAnimationNone = 0; +const static NSUInteger kASCollectionViewAnimationNone = UITableViewRowAnimationNone; #pragma mark - diff --git a/AsyncDisplayKit/ASTableView.mm b/AsyncDisplayKit/ASTableView.mm index ff2410eab0..02a5ced3fe 100644 --- a/AsyncDisplayKit/ASTableView.mm +++ b/AsyncDisplayKit/ASTableView.mm @@ -126,6 +126,16 @@ static BOOL _isInterceptedSelector(SEL sel) @implementation ASTableView +void ASPerformBlockWithoutAnimation(BOOL withoutAnimation, void (^block)()) { + if (withoutAnimation) { + [UIView setAnimationsEnabled:NO]; + block(); + [UIView setAnimationsEnabled:YES]; + } else { + block(); + } +} + #pragma mark - #pragma mark Lifecycle @@ -467,29 +477,36 @@ static BOOL _isInterceptedSelector(SEL sel) - (void)rangeController:(ASRangeController *)rangeController didInsertNodesAtIndexPaths:(NSArray *)indexPaths withAnimationOption:(ASDataControllerAnimationOptions)animationOption { ASDisplayNodeAssertMainThread(); - - [super insertRowsAtIndexPaths:indexPaths withRowAnimation:(UITableViewRowAnimation)animationOption]; + ASPerformBlockWithoutAnimation(animationOption == UITableViewRowAnimationNone, ^{ + [super insertRowsAtIndexPaths:indexPaths withRowAnimation:(UITableViewRowAnimation)animationOption]; + }); } - (void)rangeController:(ASRangeController *)rangeController didDeleteNodesAtIndexPaths:(NSArray *)indexPaths withAnimationOption:(ASDataControllerAnimationOptions)animationOption { ASDisplayNodeAssertMainThread(); - [super deleteRowsAtIndexPaths:indexPaths withRowAnimation:(UITableViewRowAnimation)animationOption]; + ASPerformBlockWithoutAnimation(animationOption == UITableViewRowAnimationNone, ^{ + [super deleteRowsAtIndexPaths:indexPaths withRowAnimation:(UITableViewRowAnimation)animationOption]; + }); } - (void)rangeController:(ASRangeController *)rangeController didInsertSectionsAtIndexSet:(NSIndexSet *)indexSet withAnimationOption:(ASDataControllerAnimationOptions)animationOption { ASDisplayNodeAssertMainThread(); - [super insertSections:indexSet withRowAnimation:(UITableViewRowAnimation)animationOption]; + ASPerformBlockWithoutAnimation(animationOption == UITableViewRowAnimationNone, ^{ + [super insertSections:indexSet withRowAnimation:(UITableViewRowAnimation)animationOption]; + }); } - (void)rangeController:(ASRangeController *)rangeController didDeleteSectionsAtIndexSet:(NSIndexSet *)indexSet withAnimationOption:(ASDataControllerAnimationOptions)animationOption { ASDisplayNodeAssertMainThread(); - [super deleteSections:indexSet withRowAnimation:(UITableViewRowAnimation)animationOption]; + ASPerformBlockWithoutAnimation(animationOption == UITableViewRowAnimationNone, ^{ + [super deleteSections:indexSet withRowAnimation:(UITableViewRowAnimation)animationOption]; + }); } #pragma mark - ASDataControllerDelegate