有一个方法在第三方API中的动画块内被调用。在这个方法里,我需要构建一些子视图。但是在这种情况下,我不希望在构建子视图时发生动画。
有没有一种方式可以说“[UIView dontAnimateFromHere] ... [UIView nowYouMayAnimateAgain]”?
确实有这样一种方法。它是这样的:
[UIView setAnimationsEnabled:NO];
// Animations happen here
[UIView setAnimationsEnabled:YES];
这将禁用通过块触发的UIView动画以及使用旧的begin/end方法触发的动画。
话虽如此,我假设你的第三方库是预编译的,否则你可以直接修改源代码:当然也有可能它正在以其他方式进行奇怪的动画,因此此解决方案可能会产生不同的结果。
这不会禁用动画块中所做的更改:它们将立即发生。否则,由于第三方API会对视图的位置产生错误的假设,你可能会遇到糟糕的事情。
对于iOS 7及以上版本,有这个UIView的+performWithoutAnimation:。
请注意,performWithoutAnimation
对于在动画块内立即执行更改非常有用,但它不会禁用在嵌套块内进行的动画调用,因此仅用于方便,但不如原始答案的setAnimationsEnabled
稳健。