用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对象。