在iOS4及以上版本中明确禁用UIView动画

17

我阅读到苹果建议使用基于块的动画而不是CATransaction。

以前,我使用以下代码禁用动画:

[CATransaction begin];
[CATransaction setDisableActions: YES];
// !!! resize
[CATransaction commit];

是否有新的推荐方法来完成这个任务,还是原来的方法仍然可行?

5个回答

37
[UIView setAnimationsEnabled:NO];
//animate here
[UIView setAnimationsEnabled:YES];

2
使用 UIView 方法的问题在于,无法像使用 CATransaction 方法那样进行嵌套。因此,如果您有一段禁用动画的代码块,并调用了其他禁用动画的内容 该代码块内部,那么动画将在代码块结束之前重新启用。 - jasongregori
解决这个问题的简单方法是检查状态,使用 areAnimationsEnabled,然后在完成后将其恢复到原来的状态。 - Joshua Weinberg
如果我需要为特定的视图对象禁用动画,而不是所有视图,该怎么办? - BergP
@JoshuaWeinberg,我在使用这个时遇到了问题,你能否请看一下这个链接https://dev59.com/aGQn5IYBdhLWcg3we3AE - Prasad Devadiga

27

对于 iOS 7 及以上版本,可以使用以下方法实现:

[UIView performWithoutAnimation:^{    // Changes we don't want animated here
    view.alpha = 0.0;
}];

我仍然不明白这个用例。为什么我要将其包装在块中呢?为什么不只是说“view.alpha = 0.0;”并完成它呢? - Greg Maletic
5
有时候正在运行的代码已经是调用堆栈中其他地方的动画的一部分,这样更新操作就不会被动画化。 - Brentley Jones
啊...所以这个想法是被某些其他的[UIView animate]调用包裹,而这是一个小的内部保留区,所以我可以在那个动画块中包含一些我不想要动画的东西? - Greg Maletic
正确。有时候您也会被系统的动画所吸引。 - Brentley Jones
是的,我刚刚发现了这个,并且将其用于正好符合这种使用情况:陷入系统动画中,或者可能是在遗留代码中的某个动画,我找不到! - simonthumper

10

Swift 3+

UIView.performWithoutAnimation {
            // Update UI that you don't want to animate
        }

3
对于使用MonoTouch(C#)的用户,这里有一个帮助类:
public class UIViewAnimations : IDisposable
{
    public UIViewAnimations(bool enabled)
    {
        _wasEnabled = UIView.AnimationsEnabled;
        UIView.AnimationsEnabled = enabled;
    }

    public void Dispose()
    {
        UIView.AnimationsEnabled = _wasEnabled;
    }

    bool _wasEnabled;
}

例子:

using (new UIViewAnimations(false))
    imageView.Frame = GetImageFrame();

1
很高兴有人发现它有用。简要概述:https://gist.github.com/jfoshee/5008117 - Jacob Foshee

2
// Disable animations
UIView.setAnimationsEnabled(false)

// ...
// VIEW CODE YOU DON'T WANT TO ANIMATE HERE
// ...

// Force view(s) to layout
yourView(s).layoutIfNeeded()

// Enable animations
UIView.setAnimationsEnabled(true)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接