Avoid animation of UICollectionView after reloadItemsAtIndexPaths

后端 未结 9 1824
情深已故
情深已故 2020-12-04 06:07

UICollectionView animate items after reloadItemsAtIndexPaths is called (fade animation).

Is there a way to avoid this animation?

iOS 6

相关标签:
9条回答
  • 2020-12-04 06:08

    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.

    0 讨论(0)
  • 2020-12-04 06:11

    I wrote a category on UICollectionView to do just that. The trick is to disable all animations while reloading:

    if (!animated) {
        [CATransaction begin];
        [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
    }
    
    [self reloadItemsAtIndexPaths:indexPaths];
    
    if (!animated) {
        [CATransaction commit];
    }
    
    0 讨论(0)
  • 2020-12-04 06:13
    extension UICollectionView {
        func reloadWithoutAnimation(){
            CATransaction.begin()
            CATransaction.setValue(kCFBooleanTrue, forKey: kCATransactionDisableActions)
            self.reloadData()
            CATransaction.commit()
        }
    }
    
    0 讨论(0)
  • 2020-12-04 06:16

    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 UIKit
    
    class 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.

    0 讨论(0)
  • 2020-12-04 06:24

    Here is a Swift 3 version to performBatchUpdates without animation to a UICollectionView. I found this to work better for me than collectionView.reloadData() because it reduced cell swapping when records were inserted.

    func appendCollectionView(numberOfItems count: Int){
    
            // calculate indexes for the items to be added
            let firstIndex = dataItems.count - count
            let lastIndex = dataItems.count - 1
    
            var indexPaths = [IndexPath]()
            for index in firstIndex...lastIndex {
                let indexPath = IndexPath(item: index, section: 0)
                indexPaths.append(indexPath)
            }
    
       UIView.performWithoutAnimation {
    
            self.collectionView.performBatchUpdates({ () -> Void in
                self.collectionView.insertItems(at: indexPaths)
            }, completion: { (finished) -> Void in
    
            })
        }
    }
    
    0 讨论(0)
  • 2020-12-04 06:24
    - (void)reloadCollectionViewAnimated:(BOOL)animated  {
    
        if (animated) {
            [self.collectionView performBatchUpdates:^{
                [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
            } completion:^(BOOL finished) {
    
            }];
        } else {
            [CATransaction begin];
            [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
            [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
            [CATransaction commit];
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题