单击导航栏中的“后退”按钮时阻止动画?

时间:2010-06-25 15:59:26

标签: iphone uinavigationcontroller back-button

我的应用程序有一个导航控制器,我不想要任何动画:

  • 在推送视图时阻止动画,通过pushViewController:animated:method

  • 很容易
  • 但是当我点击这个子视图中的“后退”按钮时,会有一个动画! KO!我该怎么做才能阻止这个动画?

5 个答案:

答案 0 :(得分:4)

这可以防止默认动画。

- (void)viewWillDisappear:(BOOL)animated {
    [UIView setAnimationsEnabled: NO];
}

- (void)viewDidDisappear:(BOOL)animated {
    [UIView setAnimationsEnabled: YES];
}

如果您需要自定义动画

- (void)viewWillDisappear:(BOOL)animated {
    [UIView setAnimationsEnabled: NO];

    CATransition *transition = [CATransition animation];
    transition.duration = 0.3;
    transition.type = kCATransitionFade;
    [self.navigationController.view.layer addAnimation:transition forKey:kCATransition];
}

- (void)viewDidDisappear:(BOOL)animated {
    [UIView setAnimationsEnabled: YES];
}

答案 1 :(得分:3)

我来找SO寻找一个更优雅的解决方案,但到目前为止我已经(成功)做到了这一点。

基本理念:

  1. 不要使用UINavigationController;而是使用它的组成部分(例如UINavigationBar)并自己完成工作
  2. 触发导航栏以与您自己的自定义动画并行制作动画(或者,如果您不想要任何动画,则触摸不动画)
  3. 缺点:

    1. UINavigationController自动处理其他一些事情,比如内存加载/卸载。此外,它被“硬编码”到所有UIViewControllers中 - 它们总是引用包含它们的UINavigationController。抛弃所有这些只是因为Apple没有提供设置自定义动画的钩子,这是一种耻辱。
    2. 代码 - 无论哪个类接管动画:

      UINavigationItem *backItem = [[UINavigationItem alloc] initWithTitle:@"Back"];
      [navigationController.navigationBar pushNavigationItem:backItem animated:TRUE];
      // next line only needed if you want a custom back anim too
      navigationController.navigationBar.delegate = self;
      

      ...如果您还希望使用自定义后退动画切入,则需要上面的最后一行,这样您就可以收听导航栏并进行并行反应,如下所示:

      - (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
      {
          // trigger your custom back animation here
      
          return TRUE;
      }
      

答案 2 :(得分:3)

一个类别更优雅。这假设您在应用程序委托中设置了导航控制器对象。只需将它放在根视图控制器中的@implementaion之前。

#import "AppDelegate.h"

@implementation UINavigationBar (custom)
- (UINavigationItem *)popNavigationItemAnimated:(BOOL)animated;
{

    AppDelegate *delegate = [[UIApplication sharedApplication] delegate];

    [delegate.navController popViewControllerAnimated:NO];

    return TRUE;
}


@end

答案 3 :(得分:2)

不是您应该这样做,但是您可以通过在viewController中创建自定义leftBarButtonItem来覆盖标准行为。

UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"Back" style: UIBarButtonItemStylePlain target:self action:@selector(backButtonPressed)];
[[self navigationItem] setLeftBarButtonItem:item];
[item release];

- (void)backButtonPressed
{
    [[self navigationContoller] popViewControllerAnimated:NO];
}

documentation表示您只应在显示导航控件的视图之前传递NO

请记住,不符合iPhone接口指南的应用程序将不会被接受到应用商店中。

答案 4 :(得分:0)

我刚刚回答了另一个相关问题,该问题描述了如何easily create a custom back button that replicates the look of the standard iOS (iPhone / iPad) UI back bar button item但允许添加其他功能。根据{{​​3}}中的建议,在backButtonPressed方法中,只需添加:

[[self navigationController] popViewControllerAnimated:NO];