用autoreverse UIViewanimation
我有设置UIViewAnimationOptionAutoReverse
问题。 这是我的代码。
CALayer *aniLayer = act.viewToChange.layer; [UIView animateWithDuration:2.0 delay:1.0 options:(UIViewAnimationCurveLinear | UIViewAnimationOptionAutoreverse) animations:^{ viewToAnimate.frame = GCRectMake(1,1,100,100); [aniLayer setValue:[NSNumber numberWithFloat:degreesToRadians(34)] forKeyPath:@"transform.rotation"]; } completion:nil ];
问题在于,在animation颠倒之后,视图跳回到animation块中设置的帧。 我希望这个观点能够成长并“放弃”,并停止在原来的位置上。
有没有编程两个连续的animation解决scheme?
你有三个select。
当您使用-[UIView animateWithDuration:…]
方法时,您在animations
块中所做的更改将立即应用于有问题的视图。 然而,还有一个隐式的CAAnimation
应用于视图,从旧值animation到新值。 当CAAnimation
在视图上处于活动状态时,会更改显示的视图,但不会更改视图的实际属性。
例如,如果你这样做:
NSLog(@"old center: %@", NSStringFromCGPoint(someView.center)); [UIView animateWithDuration:2.0 animations: ^{ someView.center = newPoint; }]; NSLog(@"new center: %@", NSStringFromCGPoint(someView.center));
你会看到“老中心”和“新中心”是不同的; 新中心将立即反映newPoint的价值。 然而,隐含创造的CAAnimation
会导致视图依然显示在旧中心,并顺利移动到新中心。 animation完成后,将从视图中删除,然后切换回仅看到实际模型值。
当你传递UIViewAnimationOptionAutoreverse
,它会影响隐式创build的CAAnimation
,但不影响你对这些值做出的实际改变。 也就是说,如果我们上面的例子已经定义了UIViewAnimationOptionAutoreverse
,那么隐式创build的CAAnimation
将从oldCenter生成到newCenter并返回。 animation将被删除,我们将切换回看到我们设置的值… 这仍然是在新的位置 。
正如我所说,有三种方法来处理这个问题。 首先是在animation上添加一个完成块来反转它,如下所示:
第一select
CGPoint oldCenter = someView.center; [UIView animateWithDuration:2.0 animations: ^{ someView.center = newPoint; } completion: ^(BOOL finished) { [UIView animateWithDuration:2.0 animations:^{ someView.center = oldCenter; }]; }];
第二个选项
第二种方法是像你在做的那样对animation进行自动反向处理,然后将视图设置回完成块中的原始位置:
CGPoint oldCenter = someView.center; [UIView animateWithDuration:2.0 delay:0 options: UIViewAnimationOptionAutoreverse animations: ^{ someView.center = newPoint; } completion: ^(BOOL finished) { someView.center = oldCenter; }];
但是,这可能会导致animation自动反向完成和完成块运行之间闪烁,因此可能不是您的最佳select。
第三选项
最后的select是直接简单地创build一个CAAnimation
。 当你不想改变你改变的财产的最终价值,这往往是简单的。
#import <QuartzCore/QuartzCore.h> CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"]; animation.autoreverses = YES; animation.repeatCount = 1; // Play it just once, and then reverse it animation.toValue = [NSValue valueWithCGPoint:newPoint]; [someView.layer addAnimation:animation forKey:nil];
请注意, CAAnimation
的做事方式决不会改变视图的实际值; 它只是用animation掩盖实际值。 视图仍然认为它在原始位置。 (例如,这意味着如果您的视图对触摸事件作出响应,它仍然会在原始位置观察触摸事件的发生,animation只会改变视图的绘制方式,而不会改变视图的方式。
CAAnimation
方法还要求将其添加到视图的底层CALayer
。 如果这让你感到恐慌,请随意使用-[UIView animateWithDuration:…]
方法。 使用CAAnimation
还有其他的function,但是如果你不熟悉的话,链接UIViewanimation或者在完成块中重置它是完全可以接受的。 实际上,这是完成块的主要目的之一。
所以,你去了。 三种不同的方式来反转animation并保持原始值。 请享用!
这是我的解决scheme。 对于2x重复,animation1.5倍,自己做最后0.5倍的部分:
[UIView animateWithDuration:.3 delay:.0f options:(UIViewAnimationOptionRepeat| UIViewAnimationOptionAutoreverse) animations:^{ [UIView setAnimationRepeatCount:1.5f]; ... animate here ... } completion:^(BOOL finished) { [UIView animateWithDuration:.3 animations:^{ ... finish the animation here .... }]; }];
不闪烁,工作很好。
repeatCount
上有一个repeatCount
属性。 我认为你必须创build一个明确的CAAnimation
对象,并正确configuration它。 增长和ungrow的repeatCount将是2,但是你可以testing这个。
这是一个很长的路线。 您将需要两个CAAnimation对象,一个用于框架,另一个用于旋转。
CABasicAnimation *theAnimation; theAnimation=[CABasicAnimation animationWithKeyPath:@"transform.rotation"]; theAnimation.duration=3.0; theAnimation.repeatCount=1; theAnimation.autoreverses=YES; theAnimation.fromValue=[NSNumber numberWithFloat:0.0]; theAnimation.toValue=[NSNumber numberWithFloat:degreesToRadians(34)]; [theLayer addAnimation:theAnimation forKey:@"animateRotation"];
AFAIK没有办法避免编程两个animation对象。