setAnimationBeginsFromCurrentState=YES 在 iOS 5 或 iPad 上不起作用吗?

Posted

技术标签:

【中文标题】setAnimationBeginsFromCurrentState=YES 在 iOS 5 或 iPad 上不起作用吗?【英文标题】:Is setAnimationBeginsFromCurrentState=YES not working in iOS 5 or on the iPad? 【发布时间】:2011-12-04 16:28:14 【问题描述】:

即使我的所有动画块都配置有:

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。不应该发生。也许是一个糟糕的选项组合?

【问题讨论】:

我在 iPad 模拟器上的 ios5 上做基于块的动画,它们从当前状态开始就好了 - 没有太大帮助,但我不认为它们“坏了” - 你能贴一些你的动画代码? 我有同样的问题,但在设备上也是如此。我不明白为什么这个问题被标记了。 【参考方案1】:

您在视图动画块中说self.layer.transform =。视图动画块用于为 view 设置动画。您可以通过设置视图的动画属性而不是图层的动画属性来做到这一点。

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

所以解决方案是说self.transform =(如果 self 是一个视图),或者根本不使用基于块的动画 - 使用核心动画(例如 CABasicAnimation)为图层设置动画。

【讨论】:

【参考方案2】:

这是一个有效的例子:

        [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 模拟器上的工作方式与其他任何地方相同。所以有一个反例。

您能否按照另一条评论的要求,实际显示不起作用的代码? (您已经显示了第二个动画的示例代码,但没有显示第一个动画,因此无法测试。)

【讨论】:

其他动画看起来完全一样。只是设置一个不同的变换。基本上我只是调用一个将转换作为参数的方法。 这很好,但我刚刚提供了在 iOS 5 iPad 模拟器上运行良好的代码。在我看来,现在你的工作是提供在 iOS 5 iPad 模拟器上不能正常工作的代码。如果你不这样做,怎么会有人看到有问题?

以上是关于setAnimationBeginsFromCurrentState=YES 在 iOS 5 或 iPad 上不起作用吗?的主要内容,如果未能解决你的问题,请参考以下文章