我需要处理一个案例,您可以使用或不使用动画来执行某些操作,而不是:
if (animation)
{
[UIView animateWithBlock:^(){...}];
}
else
{
...
}
我想这样做:
[UIView animateWithBlock:^(){...} duration:(animation ? duration : 0)]
但不确定它是否有效,即使它有效,是否有使用它的开销而不是直接更改视图?
由于
答案 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];**
如果有任何问题,请告诉我。