【问题标题】:UIView Animations stop working after dismiss Modal ViewUIView 动画在关闭模态视图后停止工作
【发布时间】:2011-04-24 16:55:23
【问题描述】:

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

【问题讨论】:

  • 确保在未连接调试器的设备上存在此问题。在模拟器上调试时,我注意到一些奇怪的动画行为

标签: iphone


【解决方案1】:

尝试检查两件事:

  • 您是否提交所有已启动的动画?一个都没犯,我得到了各种奇怪的效果。
  • 是否有任何动画同时发生?尤其是观点相同的人。
  • 在更改属性后是否立即出现任何动画。比如:

-

view.alpha = 1;
[UIView beginAnimations:…];
view.alpha = 0;
[UIView commitAnimations:…];

在此示例中,视图不会将其 alpha 值从 1 更改为 0。它会立即更改。要启动动画,您必须将动画块提取到另一个方法并使用 performSelectorInMainThread:withObject:afterDelay: 调用它。延迟甚至可以为 0。

【讨论】:

  • 感谢亚历山大的回答。所有动画都已提交,并且没有同时发生。我尝试将代码移到块基础动画上,但效果不佳。我想知道我是否以某种方式错过了有关关闭模态视图过渡动画的内容。接下来我会研究这个。
  • 有趣的第三点。我会试一试并报告。
  • 运气不好。我在帖子中添加了更多代码,展示了应用程序中的地图框架是如何动画的。正如我之前所说,在使用模态视图之前它运行良好。
  • 抱歉,没有其他想法。而且没有足够的数据来找出其他的东西。
  • 我明白了,感谢您的帮助。如果其他人遇到问题,它的价值是多少,我认为这归结为解雇电话。动画在呈现后在模态视图本身中可以正常工作,但是当它被关闭并再次呈现时,动画不再起作用。
【解决方案2】:

我通过在 UIView 子类中重新启动动画解决了这个问题:

override func willMove(toWindow newWindow: UIWindow?) {
    if newWindow != nil {
        spinner.startSpinning() // Restart any animation here
    }
}

【讨论】:

  • 这是一个自定义视图的解决方案,它是进度指示器。这里发生的情况是,呈现全屏模式视图控制器会从主窗口中删除演示者视图控制器,并且演示者视图控制器的所有子视图都将收到一个带有 nil 的操作 willMove(toWindow:)。关闭呈现的视图控制器后,呈现控制器将收到带有窗口对象的操作 willMover(toWindow:)。
【解决方案3】:

最后,我只是删除了所有模态视图并以其他方式实现它们。出于某种原因,使用模态视图会弄乱动画。没有意义,但是删除它们可以解决问题。如果有人能告诉我为什么会这样,这可能对内存问题很好......

【讨论】:

  • 有人知道为什么会这样吗?
【解决方案4】:

我有同样的问题。我的问题的根源是我的动画是由通知触发的,我在每个 viewWillAppear 上添加了一个观察者,但忘记在 viewDidDisappear 中删除(请记住,iOS 6 不再可靠地调用 viewDidUnload)。

基本上,我连续两次快速调用我的动画函数,这导致了可见的不规则性。希望这可以帮助某人!

【讨论】:

    【解决方案5】:

    我已经设法在自己的应用程序中解决了同样的问题。

    我在调试时注意到,我正在制作动画的 UIImageView 在我推送我的模态视图控制器之前和之后有不同的内存地址。这些 UIImageView 在其他任何时候都没有切换它们的内存地址。

    我认为这可能是问题的根源,看来我是对的。

    我的客户代码一直在分配/初始化我的视图控制器的 UIImageViews -viewDidAppear 而不是 -viewDidLoad。因此,每次我启动和关闭模态视图控制器时,我正在制作动画的 UIImageViews 都会重新初始化。

    请自行检查您的地图对象的内存地址在您启动模式之前和之后是否发生变化,以及是否确保将您的初始化逻辑移动到代码中更合适的部分。

    希望对您有所帮助!

    德克斯特

    【讨论】:

      【解决方案6】:

      我使用的是 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];
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-30
        • 2012-05-23
        • 1970-01-01
        • 2016-10-03
        相关资源
        最近更新 更多