Tips:取消UICollectionView的隱式動畫

http://www.cocoachina.com/ios/20151204/14211.htmlhtml

 

UICollectionView在reloadItems的時候,默認會附加一個隱式的fade動畫,有時候很討厭,尤爲是當你的cell是複合cell的狀況下(好比cell使用到了UIStackView)。ios

下面幾種方法均可以幫你去除這些動畫動畫

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//方法一
[UIView performWithoutAnimation:^{
     [collectionView reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:index inSection:0]]];
}];
//方法二
[UIView animateWithDuration:0 animations:^{
     [collectionView performBatchUpdates:^{
         [collectionView reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:index inSection:0]]];
     } completion:nil];
}];
     
//方法三
[UIView setAnimationsEnabled:NO];
[self.trackPanel performBatchUpdates:^{
     [collectionView reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:index inSection:0]]];
} completion:^(BOOL finished) {
     [UIView setAnimationsEnabled:YES];
}];

若是你的APP只支持iOS7+ 推薦使用第一種方式performWithoutAnimation(感謝@sunnyxx的tip) 簡單方便spa

butcode

問題尚未結束 上面介紹的方法只能解決UIView的Animation 若是你的cell中還包含有CALayer的動畫 好比這樣orm

1
2
3
4
5
6
- (void)layoutSubviews
{
     [ super  layoutSubviews];
     
     self.frameLayer.frame = self.frameView.bounds;
}

上述狀況多用於自定義控件使用了layer.mask的狀況 若是有這種狀況 上面提到的方法是沒法取消CALayer的動畫的 可是解決辦法也很簡單htm

1
2
3
4
5
6
7
8
9
10
11
12
- (void)layoutSubviews
{
     [ super  layoutSubviews];
     
     [CATransaction begin];
     [CATransaction setDisableActions:YES];
     
     self.frameLayer.frame = self.frameView.bounds;
     
     [CATransaction commit];
     
}

done!ip

相關文章
相關標籤/搜索