[ios] 在reloadItemsAtIndexPaths之後避免使用UICollectionView的動畫


Answers

值得注意的是,如果你的目標是iOS 7及更高版本,你可以使用新的UIView方法performWithoutAnimation: . 我懷疑在幕後這與其他答案(暫時禁用UIView動畫/核心動畫動作)的作用大致相同,但語法很好而且乾淨。

所以對於這個問題尤其......

Objective-C的:

[UIView performWithoutAnimation:^{
    [self.collectionView reloadItemsAtIndexPaths:indexPaths];
}];


迅速:

UIView.performWithoutAnimation {
    self.collectionView.reloadItemsAtIndexPaths(indexPaths)
}


當然,這個原則可以應用於您希望確保更改不是動畫的任何情況。

Question

調用reloadItemsAtIndexPaths後,UICollectionView動畫項目(淡入淡出動畫)。

有沒有辦法避免這個動畫?

iOS 6




extension UICollectionView {
    func reloadWithoutAnimation(){
        CATransaction.begin()
        CATransaction.setValue(kCFBooleanTrue, forKey: kCATransactionDisableActions)
        self.reloadData()
        CATransaction.commit()
    }
}



這是一個Swift 3版本,可以在沒有動畫的情況下執行UICollectionViewUICollectionView 。 我發現這對我來說比collectionView.reloadData()更好用,因為它減少了插入記錄時的單元格交換。

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.02美元,我嘗試了所選答案的兩個版本,並且原始方式更適合我的目的。 我正在開發一個無限滾動日曆視圖,允許用戶在給定的一周輸入日曆,然後來回滑動並選擇過濾列表的各個日期。

在我的實現中,為了保持舊設備的性能,表示日曆視圖的日期數組必須保持相對較小,這意味著保持約5週的日期,用戶在第3週的中間。 使用第二種方法的問題是,還有第二步,您必須將集合視圖滾動回中間而不使用動畫,這會因為某些原因而使用基於阻止的基本動畫而出現鋸齒狀外觀。

我的代碼:

[UIView setAnimationsEnabled:NO];
[self.collectionView performBatchUpdates:^{
    [self.collectionView deleteItemsAtIndexPaths:indexPathDeleteArray];
    [self.collectionView insertItemsAtIndexPaths:indexPathAddArray];

} completion:NULL];
[UIView setAnimationsEnabled:YES];

NSIndexPath *newIndexPath = [NSIndexPath indexPathForItem:14 inSection:0];
[self.collectionView scrollToItemAtIndexPath:newIndexPath atScrollPosition:UICollectionViewScrollPositionLeft animated:NO];



Links