17

我需要处理一种情况,您可以在有或没有动画的情况下做某事,而不是:

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

我想要做:

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

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

谢谢

4

6 回答 6

30

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

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

    }];
}else{
    animationBlock();
}

这将避免开销

于 2012-12-29T22:52:38.227 回答
21

根据苹果文档:

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

于 2013-03-19T06:04:34.080 回答
8

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

于 2012-11-13T22:28:01.317 回答
4

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

于 2017-03-03T14:39:27.600 回答
2

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

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

于 2014-06-30T05:49:22.507 回答
0

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

如果设置为 0,则表示没有动画过渡时间。因此,View 将出现没有任何动画。如果要提供动画,请设置大于 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];**

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

于 2013-03-19T06:14:46.337 回答