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

Objective c UIView动画块:如果持续时间为0,是否与没有动画时相同?,objective-c,ios,uiview,uiviewanimation,Objective C,Ios,Uiview,Uiviewanimation,我需要处理一种情况,在这种情况下,您可以使用动画或不使用动画来做一些事情,而不是: if (animation) { [UIView animateWithBlock:^(){...}]; } else { ... } 我想做: [UIView animateWithBlock:^(){...} duration:(animation ? duration : 0)] 但不确定它是否有效,即使有效,使用它而不是直接更改视图是否有任何开销 谢谢是的,由于持续时间为零,因此转换将

我需要处理一种情况,在这种情况下,您可以使用动画或不使用动画来做一些事情,而不是:

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

[UIView animateWithBlock:^(){...} duration:(animation ? duration : 0)]
但不确定它是否有效,即使有效,使用它而不是直接更改视图是否有任何开销


谢谢

是的,由于持续时间为零,因此转换将有效地通过瞬间进行

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

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

    }];
}else{
    animationBlock();
}

这将避免开销

根据苹果文档:

如果动画的持续时间为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];**

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

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


因此,不,我绝对建议不要使用零作为持续时间,因为它不是同步的。

我写了这个小小的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。

它是否有任何开销?例如,
[UIView animateWithBlock:^(){self.view.frame=newFrame},持续时间:0]
vs
self.view.frame=newFrame
?您需要先设置帧,使其与任何其他帧一样工作。-是的,它会有开销。我用iOS 7.1.1 5S测试过,差别很大;使用^animateWithBlock:^为视图设置10k次的随机帧需要22.85秒,直接调用该块需要0.05秒。但是,如果您仅为一些用户交互执行了一些动画调用,则差异并不相关。请注意,苹果将来可能会改变这种行为并优化这种边缘案例。这个答案不再准确。设置为0不会立即发生,它将需要接近0.25秒的默认时间段。因此,从执行动画语句时起,实际上可能不是0延迟?@hzxu。其效果与调用
[自执行选择器:@selector(animate)afterDelay:0]
相同。我可以确认情况确实如此。使用0并不等于不立即设置动画并执行它。