我需要处理一种情况,您可以在有或没有动画的情况下做某事,而不是:
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,则在下一个 run loop 循环开始时执行此块。
是的,由于持续时间为零,因此过渡将有效地瞬间完成。
我写了这个小小的 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。
好的,我对此有进一步的观察。首先,使用零持续时间的动画会产生性能开销,但更深刻的区别是动画的完成块是异步处理的。这意味着首先隐藏然后显示视图可能无法获得预期的结果。
所以,不,我绝对建议不要使用零作为持续时间,因为它不是同步的。
您可以根据要求动态设置 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];**
如果有任何问题,请告诉我。