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