实际上 iOS 好像是会在很多地方默认添加上动画的。这些动画倒也还好,但是有的时候就和需求不符就比较烦人了。

前几天偶然的再次查到了这个方法,于是决定开个文章记录一下。

感谢参考1,原作者的总结。本文基本引用自参考1。


说到隐式动画,之前在做手势控件的时候,对于 CALayer 的一些操作就会有隐式动画,例如说下面这行代码就会有隐式动画:

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

这里介绍几种可以去掉系统动画的方法。如果您想隐藏的是 CALayer 相关的动画,请直接参考 方法三

方法一

方法一是使用 UIView 类的类方法: performWithoutAnimation

[UIView performWithoutAnimation:^{
    // your     code    
}];

如果你的 App 需要最少支持到 iOS 7 。那么推荐你使用该方法。

方法二

该方法可行,但是实在是太蠢了,不建议使用

在你知道会产生动画的代码处,再次添加一个动画,只不过将这个动画的时间设为0

[UIView animateWithDuration:0 animations:^{
    [collectionView performBatchUpdates:^{
        [collectionView reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:index inSection:0]]];
    } completion:nil];
}];

方法三

方法四是针对 CALayer隐式动画的。这种情况下上面的三种方法是无效的,只能采用方法四:

[CATransaction begin];
[CATransaction setDisableActions:YES];
    
// CALayer 动画
self.frameLayer.frame = self.frameView.bounds;
    
[CATransaction commit];

参考

  1. iOS开发小技巧-如何去掉隐式动画——木头加白水