ios 取消view的隐式动画

505 阅读1分钟

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

`//方法一`

`[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的动画 比如这样

`- (void)layoutSubviews`

`{`

`    ``[``super` `layoutSubviews];`

`    ` 

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

`}`

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

`- (void)layoutSubviews`

`{`

`    ``[``super` `layoutSubviews];`

`    ` 

`    ``[CATransaction begin];`

`    ``[CATransaction setDisableActions:YES];`

`    ` 

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

`    ` 

`    ``[CATransaction commit];`

`    ` 

`}`

转自:www.cnblogs.com/itlover2013…

[self.layer removeAllAnimations];//移除layer的所有动画