Tips:取消UICollectionView的隐式动画
阅读原文时间:2023年07月10日阅读:3

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

UICollectionView在reloadItems的时候,默认会附加一个隐式的fade动画,有时候很讨厌,尤其是当你的cell是复合cell的情况下(比如cell使用到了UIStackView)。

下面几种方法都可以帮你去除这些动画

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) 简单方便

but

问题还没有结束 上面介绍的方法只能解决UIView的Animation 如果你的cell中还包含有CALayer的动画 比如这样

1

2

3

4

5

6

- (void)layoutSubviews

{

[``super layoutSubviews];

self.frameLayer.frame = self.frameView.bounds;

}

上述情况多用于自定义控件使用了layer.mask的情况 如果有这种情况 上面提到的方法是无法取消CALayer的动画的 但是解决办法也很简单

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!

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章