setAnimationBeginsFromCurrentState = YES在iOS 5或iPad上无效吗?

时间:2011-12-04 16:28:14

标签: iphone ios ipad core-animation

即使我的所有动画块都配置了以下内容,我的动画也不会在飞行时从当前状态中获取,即使我的所有动画块都配置为:

setAnimationBeginsFromCurrentState=YES

基于块的动画(iOS 4以来的新方法)也是如此,设置了UIViewAnimationOptionBeginFromCurrentState选项。

在我所有的旧设备上,这完美无缺。在iOS 5和iPad模拟器上它没有。有解决方法吗?

(注意:它似乎适用于所有经过测试的设备。只是不是模拟器。)

这是一个在4.3或5.0 iPad模拟器中无效的示例:

[UIView animateWithDuration:0.5 
                      delay:1.0f 
                    options:UIViewAnimationOptionCurveEaseIn | UIViewAnimationOptionBeginFromCurrentState | 
 UIViewAnimationOptionOverrideInheritedDuration | UIViewAnimationOptionOverrideInheritedCurve 
                 animations:^{
                     self.layer.transform = CATransform3DScale(CATransform3DIdentity, 0.5f, 0.5f, 1.0f);
                 }  
                 completion:^(BOOL finished) {
                    [self performSelector:@selector(finishedScaling)];
                 }];

另一个动画开始将变换比例设置为0.1,0.1(=非常小)。在飞行中,这个动画开始并尝试将其恢复到0.5,0.5。在踢球时,先前开始的动画突然以0.1,0.1(=非常小)结束。然后从0.1缩小到0.5。不应该发生。也许是糟糕的期权组合?

2 个答案:

答案 0 :(得分:2)

您在视图动画块中说self.layer.transform =。视图动画块用于动画视图。您可以通过设置视图的可动画属性来实现此目的 - 而不是图层的可动画属性。

此外,如果self是一个视图,那么self.layer.transform不是隐式可动画的。您不能隐式地(即通过设置属性)动画视图的底层。当您说self.layer.transform =时,该图层将始终跳转到新值。

所以解决方案是说self.transform =(如果self是视图),或者根本不使用基于块的动画 - 使用Core Animation(例如CABasicAnimation)来动画图层。

答案 1 :(得分:0)

这是一个有效的例子:

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:1];
        CGPoint p = v.center;
        p.x += 100;
        v.center = p;
        [UIView commitAnimations];

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationBeginsFromCurrentState:YES];
        [UIView setAnimationDuration:1];
        CGPoint p2 = v.center;
        p2.y = 0; // and try changing x to y
        v.center = p2;
        [UIView commitAnimations];

使用setAnimationBeginsFromCurrentState:YES,两个动画一起工作,一起更改视图的x和y位置。没有它,第一个动画在第二个动画开始之前表示为右侧的“跳跃”。所以我会说setAnimationBeginsFromCurrentState:YES仍在正常工作。它在iPad模拟器上的工作方式与其他地方相同。所以有一个反例。

您是否可以按照其他评论的要求实际显示无效的代码? (您已经显示了第二个动画的示例代码,但没有显示第一个动画,因此无法进行测试。)