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

pdsfdshx  于 2022-12-01  发布在  iOS
关注(0)|答案(7)|浏览(125)

我需要处理这样一个案例,你可以做一些有或没有动画,而不是:

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

我想做的是:

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

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

smdnsysy

smdnsysy1#

在这种情况下,我所做的是创建一个包含所有我想制作的动画的块。然后执行一个UIView动画,将动画块作为参数传递,或者直接调用该块,不管我是否想让它动画化。类似于:

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

    }];
}else{
    animationBlock();
}

这样可以避免开销

e7arh2l6

e7arh2l62#

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

6mzjoqzu

6mzjoqzu3#

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

qnzebej0

qnzebej04#

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

9lowa7mx

9lowa7mx5#

好的,我对此有进一步的观察。首先,当使用零持续时间的动画时,会有性能开销,但更深刻的区别是动画的完成块是异步处理的。这意味着先隐藏然后再显示视图可能不会得到预期的结果。
所以,不,我绝对建议不要使用零作为持续时间,因为它不是同步的。

dgiusagp

dgiusagp6#

您可以根据需要动态设置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];**

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

a1o7rhls

a1o7rhls7#

正如我所回答的,它不是。下面是一个如何在swift中做这件事的例子。

let setHighlighted: (Bool) -> Void = { [weak self] highlighted in
   if highlighted {
      self?.cardView.alpha = 0.6
   } else {
      self?.cardView.alpha = 1.0
   }
 }

 if animated {
    UIView.animate(withDuration: yourDuration) {
       setHighlighted(highlighted)
    }
 } else {
    setHighlighted(highlighted)
 }

相关问题