我需要处理这样一个案例,你可以做一些有或没有动画,而不是:
if (animation) { [UIView animateWithBlock:^(){...}]; } else { ... }
我想做的是:
[UIView animateWithBlock:^(){...} duration:(animation ? duration : 0)]
但不确定它是否有效,即使有效,使用它而不是直接更改视图是否有开销?谢谢
smdnsysy1#
在这种情况下,我所做的是创建一个包含所有我想制作的动画的块。然后执行一个UIView动画,将动画块作为参数传递,或者直接调用该块,不管我是否想让它动画化。类似于:
void (^animationBlock)(); animationBlock=^{ // Your animation code goes here }; if (animated) { [UIView animateWithDuration:0.3 animations:animationBlock completion:^(BOOL finished) { }]; }else{ animationBlock(); }
这样可以避免开销
e7arh2l62#
根据Apple文档:如果动画的持续时间为0,则在下一个运行循环周期开始时执行此块。
6mzjoqzu3#
是的,由于持续时间为零,过渡将由瞬时有效。
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。
UIView.animate(withDuration:animations:completion)
9lowa7mx5#
好的,我对此有进一步的观察。首先,当使用零持续时间的动画时,会有性能开销,但更深刻的区别是动画的完成块是异步处理的。这意味着先隐藏然后再显示视图可能不会得到预期的结果。所以,不,我绝对建议不要使用零作为持续时间,因为它不是同步的。
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];**
如果有任何问题,请告诉我。
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) }
7条答案
按热度按时间smdnsysy1#
在这种情况下,我所做的是创建一个包含所有我想制作的动画的块。然后执行一个UIView动画,将动画块作为参数传递,或者直接调用该块,不管我是否想让它动画化。类似于:
这样可以避免开销
e7arh2l62#
根据Apple文档:
如果动画的持续时间为0,则在下一个运行循环周期开始时执行此块。
6mzjoqzu3#
是的,由于持续时间为零,过渡将由瞬时有效。
qnzebej04#
我写了这个小小的Swift扩展来解决这个问题:
你可以用它来代替
UIView.animate(withDuration:animations:completion)
,而不必再考虑持续时间0。9lowa7mx5#
好的,我对此有进一步的观察。首先,当使用零持续时间的动画时,会有性能开销,但更深刻的区别是动画的完成块是异步处理的。这意味着先隐藏然后再显示视图可能不会得到预期的结果。
所以,不,我绝对建议不要使用零作为持续时间,因为它不是同步的。
dgiusagp6#
您可以根据需要动态设置animateWithDuration值。
如果设置为0,则表示没有动画过渡时间。因此,视图将不显示任何动画。如果要提供动画,请设置大于0的值。
如果有任何问题,请告诉我。
a1o7rhls7#
正如我所回答的,它不是。下面是一个如何在swift中做这件事的例子。