我刚刚将iPhone 4从iOS 4.2.1升级到4.3.2,再升级到XCode 4.0.2,我遇到了uiview动画的一些奇怪问题。当我第一次启动我的应用程序时,这样的代码执行得非常完美:
[UIView beginAnimations:@"fadeAlphaIn" context:nil];
[UIView setAnimationDuration:0.5f];
viewClue.alpha = 1.0f;
[UIView commitAnimations];
然后,在驳回一个演示文稿然后通过标准方法解雇一个模态视图之后:
[self presentModalViewController:more animated:YES];
和
[self dismissModalViewControllerAnimated:YES];
第一个动画不再有效。例如,viewClue视图只是从alpha = 0跳转到alpha = 1,而不是淡入。同样,其他动画改变其他视图的frame属性只会强制帧从初始值跳转到最终值而不动画。这些动画在模态视图呈现和解除之前工作正常。
据我所知,其他人在升级到iOS 4.3.2时遇到了动画问题,但模态视图中断动画的方式似乎很奇怪。还有其他人遇到过这个问题吗?关于解决方案的任何想法?我正在考虑将模态视图添加为子视图,并将其隐藏并显示为动画,但使用标准模态视图方法将更受欢迎。
感谢您的帮助,
詹姆斯
编辑:更多代码显示应用程序的地图是如何动画的
-(void) viewMapfunc
{
AudioServicesPlaySystemSound(soundID);
if(mapvisible){
[UIView animateWithDuration:0.5
delay:0.1
options:UIViewAnimationOptionAllowUserInteraction
animations:^{
map.frame = CGRectMake(0, 350, 320, 27);
mapscroll.frame = CGRectMake(0, 27, 320, 0);
}
completion:nil];
mapvisible = NO;
viewMapLabel.text = @"View Map";
}else {
[UIView animateWithDuration:0.5
delay:0.1
options:UIViewAnimationOptionAllowUserInteraction
animations:^{
map.frame = CGRectMake(0, 50, 320, 300);
mapscroll.frame = CGRectMake(0, 27, 320, 300);
}
completion:nil];
mapvisible = YES;
viewMapLabel.text = @"Hide Map";
}
}
答案 0 :(得分:2)
尝试检查两件事:
-
view.alpha = 1;
[UIView beginAnimations:…];
view.alpha = 0;
[UIView commitAnimations:…];
在此示例中,视图不会将其alpha值从1更改为0.它会立即更改它。要启动动画,您必须将动画块提取到另一个方法,并使用performSelectorInMainThread:withObject:afterDelay:调用它。延迟甚至可以是0。
答案 1 :(得分:0)
最后,我刚删除了所有模态视图,并以其他方式实现了它们。出于某种原因,使用模态视图搞砸了动画。没有任何意义,但删除它们解决了问题。如果有人能告诉我为什么会这样,那么对于记忆问题可能会很好......
答案 2 :(得分:0)
我有同样的问题。我的麻烦的根源是我的动画是由通知触发的,我在每个viewWillAppear上添加了一个观察者,但是忘了在viewDidDisappear中删除(请记住iOS 6不再可靠地调用viewDidUnload)。
基本上,我快速连续两次调用我的动画功能,这导致了明显的不规则性。希望这有助于某些人下线!
答案 3 :(得分:0)
我已经设法在我自己的应用程序中解决了同样的问题。
我注意到在调试时,我动画的UIImageViews在推动模态视图控制器之前和之后都有不同的内存地址。这些UIImageViews没有其他时间切换他们的内存地址。
我认为这可能是问题的根源,看来我是对的。
我的客户端代码一直在分配/初始化我的View Controller的UIImageViews -viewDidAppear而不是-viewDidLoad。因此,每次我启动并解除模态视图控制器时,我动画的UIImageViews都会重新初始化。
检查地图对象的内存地址是否在启动模式之前和之后发生变化,以及是否确保将初始化逻辑移动到代码的更合适部分。
希望这能帮到你!
德克斯特
答案 4 :(得分:0)
我正在使用UIView animateWithDuration:我通过不使用完成块解决了它。这是来自子类UIView的代码。在视图控制器的viewWillAppear中:我将self.shouldAnimate设置为YES,并在视图控制器的viewWillDisappear中:我将self.shouldAnimate设置为NO。
-(void)continueRotate {
if (self.shouldAnimate) {
[self rotateRadarView:self.radarInner];
}
}
-(void)rotateRadarView:(UIView *)view {
[UIView animateWithDuration:0.6 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(continueRotate)];
[view setTransform:CGAffineTransformRotate(view.transform, M_PI_2)];
}completion:nil];
}
答案 5 :(得分:0)
我通过在我的UIView子类中重新启动动画来解决它:
override func willMove(toWindow newWindow: UIWindow?) {
if newWindow != nil {
spinner.startSpinning() // Restart any animation here
}
}