Avoid animation of UICollectionView after reloadItemsAtIndexPaths Avoid animation of UICollectionView after reloadItemsAtIndexPaths ios ios

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.