18

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

  • 要在推送视图时防止动画,很容易,通过 pushViewController:animated: 方法

  • 但是当我点击这个子视图上的“后退”按钮时,有一个动画!KO!我能做些什么来防止这个动画?

4

5 回答 5

8

这可以防止默认动画。

- (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];
}
于 2016-06-17T13:51:56.990 回答
3

我来 SO 是为了寻找一个更优雅的解决方案,但这就是我迄今为止(成功地)这样做的方式。

基本思想:

  1. 不要使用 UINavigationController;而是使用它的组成部分(例如 UINavigationBar)并自己完成工作
  2. 触发导航栏以与您自己的自定义动画并行进行动画处理(或者,如果您根本不需要动画)

缺点:

  1. UINavigationController 自动处理一些其他的事情,比如内存加载/卸载。此外,它被“硬编码”到所有 UIViewController 中——它们总是引用包含它们的 UINavigationController。仅仅因为 Apple 没有提供设置自定义动画的钩子就将所有这些都扔掉是一种耻辱。

代码 - 在任何一个类中接管动画:

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;
}
于 2010-06-27T16:07:38.337 回答
3

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

#import "AppDelegate.h"

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

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

    [delegate.navController popViewControllerAnimated:NO];

    return TRUE;
}


@end
于 2011-05-12T22:26:21.533 回答
2

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

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];
}

文档说你应该只在导航控制器的视图显示NO 之前通过。

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

于 2010-06-25T18:11:35.763 回答
0

我刚刚回答了另一个相关问题,该问题描述了如何轻松创建自定义后退按钮,该按钮复制标准 iOS (iPhone / iPad) UI 后退栏按钮项目的外观,但允许添加其他功能。正如falconcreek 的回答所建议的那样,在backButtonPressed方法中,只需添加:

[[self navigationController] popViewControllerAnimated:NO];
于 2012-08-30T13:52:41.953 回答