【问题标题】:How to end an animation early in Cocoa Touch?如何在 Cocoa Touch 中提前结束动画?
【发布时间】:2009-08-08 20:38:40
【问题描述】:

我有一个 UINavigationController,我在其上推送一个“加载屏幕”UIViewController,同时异步连接到服务器。带有滑动效果的推动是隐含的动画。如果连接时发生错误,我会弹出加载屏幕控制器(再次动画)并向用户显示警报。

如果我在动画完成后弹出视图控制器,一切都很好,但是如果动画尚未完成,就会发生奇怪的事情。通常加载屏幕视图会保留在屏幕上,即使它已从导航控制器堆栈中弹出。我很确定问题与正在进行的动画有关。例如,这个人为的代码 sn-p 总是将 secondController 的视图留在我的屏幕上:

[navController pushViewController: secondController animated: YES];
[navController popToRootViewControllerAnimated: YES];
NSAssert([delegate.navigationController.viewControllers count] == 1, @"oops");

我目前的解决方法是向导航控制器注册一个委托并实现 navigationController:didShowViewController:animated: 方法。只有当我知道第一个推送动画完成时,我才会弹出加载屏幕控制器。但是我宁愿早点结束动画。

我已尝试为导航控制器视图的所有子视图在图层树中的所有图层上调用 removeAllAnimations。虽然这种方法提前结束了动画,但它仍然经常在弹出后仍然显示加载屏幕视图。所以基本上有一个正确的方法可以提前结束动画,还是我应该坚持我的工作?

【问题讨论】:

    标签: iphone cocoa-touch animation uikit terminate


    【解决方案1】:

    很难知道为什么要在推送后立即弹出到根视图控制器,但是当我不得不做这种事情时,我让被推送的视图控制器确定它是否需要弹出或不是。因此,在您的 secondController 的 -viewDidLoad 中,确定您弹出到根视图的条件是否为真。如果是,则通过调用从那里弹出

    [[self navigationController] popViewControllerAnimated:YES];
    

    另外,这并不是说这会解决您的问题,但您可能需要考虑使用 -presentModalViewController 推送“加载屏幕”:

    - (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated
    

    它相当于流行音乐:

    - (void)dismissModalViewControllerAnimated:(BOOL)animated
    

    【讨论】:

    • 感谢马特建议的解决方法!它可能在完成之前弹出的原因是由于在尝试连接后几乎立即收到“连接失败”回调(可能是由于设备处于飞行模式等)。我按下加载屏幕,连接,然后等待连接尝试的结果。如果我可以在这个回调中立即结束动画,它将节省一些额外的状态并简化代码:)
    【解决方案2】:

    完全未经测试,但您是否尝试过从视图控制器视图的核心动画层中移除所有动画?

    [[[secondController view] layer] removeAllAnimations];
    

    【讨论】:

      猜你喜欢
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多