即使我的所有动画块都配置了以下内容,我的动画也不会在飞行时从当前状态中获取,即使我的所有动画块都配置为:
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。不应该发生。也许是糟糕的期权组合?
答案 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模拟器上的工作方式与其他地方相同。所以有一个反例。
您是否可以按照其他评论的要求实际显示无效的代码? (您已经显示了第二个动画的示例代码,但没有显示第一个动画,因此无法进行测试。)