Avoid animation of UICollectionView after reloadItemsAtIndexPaths
It's worth noting that if you're targeting iOS 7 and above, you can use the new UIView
method performWithoutAnimation:
. I suspect that under the hood this is doing much the same as the other answers here (temporarily disabling UIView
animations / Core Animation actions), but the syntax is nice and clean.
So for this question in particular...
Objective-C:
[UIView performWithoutAnimation:^{ [self.collectionView reloadItemsAtIndexPaths:indexPaths];}];
Swift:
UIView.performWithoutAnimation { self.collectionView.reloadItemsAtIndexPaths(indexPaths)}
Of course this principle can be applied for any situation that you want to ensure a change is not animated.
You could also try this:
UICollectionView *collectionView;
...
[UIView setAnimationsEnabled:NO];[collectionView performBatchUpdates:^{ [collectionView reloadItemsAtIndexPaths:indexPaths];} completion:^(BOOL finished) { [UIView setAnimationsEnabled:YES];}];
Edit:
I have also found that if you wrap performBatchUpdates
in a UIView animation block, the UIView animation is used instead of the default animation, so you can just set the animation duration to 0, like so:
[UIView animateWithDuration:0 animations:^{ [collectionView performBatchUpdates:^{ [collectionView reloadItemsAtIndexPaths:indexPaths]; } completion:nil];}];
This is extra cool if you want to use iOS 7 springy animations during inserts and deletes!
UICollectionView animate items after reloadItemsAtIndexPaths is called (fade animation).
Is there a way to avoid this animation?
iOS 6
I assume you're using a FlowLayout. Since you're trying to get rid of the fade animation, try this:
import UIKitclass NoFadeFlowLayout: UICollectionViewFlowLayout { override func initialLayoutAttributesForAppearingItem(at itemIndexPath: IndexPath) -> UICollectionViewLayoutAttributes? { let attrs = super.initialLayoutAttributesForAppearingItem(at: itemIndexPath) attrs?.alpha = 1.0 return attrs } override func finalLayoutAttributesForDisappearingItem(at itemIndexPath: IndexPath) -> UICollectionViewLayoutAttributes? { let attrs = super.finalLayoutAttributesForDisappearingItem(at: itemIndexPath) attrs?.alpha = 1.0 return attrs }}
This is a very old question, so you're probably not targeting iOS 6 anymore. I was personally working on tvOS 11 and had the same question, so this is here for anyone who comes along with the same problem.