UIView动画块:如果持续时间为0,是否与没有动画相同?

时间:2012-11-13 22:21:00

标签: objective-c ios uiview uiviewanimation

我需要处理一个案例,您可以使用或不使用动画来执行某些操作,而不是:

if (animation)
{
    [UIView animateWithBlock:^(){...}];
}
else
{
    ...
}

我想这样做:

[UIView animateWithBlock:^(){...} duration:(animation ? duration : 0)]

但不确定它是否有效,即使它有效,是否有使用它的开销而不是直接更改视图?

由于

6 个答案:

答案 0 :(得分:27)

在这种情况下,我要做的是创建一个包含我想要制作的所有动画的块。然后执行一个UIView动画,将动画块作为参数传递,或直接调用该块,无论我是否想要动画。 像这样:

void (^animationBlock)();
animationBlock=^{
      // Your animation code goes here
};
if (animated) {
    [UIView animateWithDuration:0.3 animations:animationBlock completion:^(BOOL finished) {

    }];
}else{
    animationBlock();
}

这样可以避免开销

答案 1 :(得分:19)

根据Apple文档:

  

如果动画的持续时间为0,则在下一个运行循环周期开始时执行此块。

答案 2 :(得分:8)

是的,由于持续时间为零,过渡将有效地瞬间完成。

答案 3 :(得分:3)

我写了这个小Swift扩展来克服这个问题:

extension UIView {

/// Does the same as animate(withDuration:animations:completion:), yet is snappier for duration 0
class func animateSnappily(withDuration duration: TimeInterval, animations: @escaping () -> Swift.Void, completion: (() -> Swift.Void)? = nil) {
    if duration == 0 {
        animations()
        completion?()
    }
    else {
        UIView.animate(withDuration: duration, animations: animations, completion: { _ in completion?() })
    }
}
}

可以将其用作UIView.animate(withDuration:animations:completion)的替代品,并且不必再考虑持续时间0。

答案 4 :(得分:2)

好的,我对此有进一步的观察。第一,使用零持续时间的动画时存在性能开销,但更大的区别在于动画的完成块是异步处理的。这意味着首先隐藏然后显示视图可能无法获得您期望的结果。

所以,不,我肯定建议不要将零作为持续时间使用,因为它不是同步的。

答案 5 :(得分:0)

您可以根据需要动态设置animateWithDuration值。

如果设置为0.则表示没有动画过渡时间。因此,视图将在没有任何动画的情况下显示。如果要提供动画,请设置一个大于0的值。

    **float animationDurationValue=0.03f;
        [UIView animateWithDuration:x delay:0.0f options:UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse 
animations:^{
                             [yourView setFrame:CGRectMake(0.0f, 100.0f, 300.0f, 200.0f)];
                         }
                         completion:nil];**

如果有任何问题,请告诉我。