UIView动画在关闭Modal View后停止工作

时间:2011-04-24 16:55:24

标签: iphone

我刚刚将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";
    }
}

6 个答案:

答案 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
    }
}