我的应用程序有一个导航控制器,我不希望它有任何动画:
要在推送视图时防止动画,很容易,通过 pushViewController:animated: 方法
但是当我点击这个子视图上的“后退”按钮时,有一个动画!KO!我能做些什么来防止这个动画?
我的应用程序有一个导航控制器,我不希望它有任何动画:
要在推送视图时防止动画,很容易,通过 pushViewController:animated: 方法
但是当我点击这个子视图上的“后退”按钮时,有一个动画!KO!我能做些什么来防止这个动画?
这可以防止默认动画。
- (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];
}
我来 SO 是为了寻找一个更优雅的解决方案,但这就是我迄今为止(成功地)这样做的方式。
基本思想:
缺点:
代码 - 在任何一个类中接管动画:
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;
}
更优雅的一个类别。这假设您在应用程序委托中设置了导航控制器对象。只需将它放在根视图控制器中的 @implementaion 之前。
#import "AppDelegate.h"
@implementation UINavigationBar (custom)
- (UINavigationItem *)popNavigationItemAnimated:(BOOL)animated;
{
AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
[delegate.navController popViewControllerAnimated:NO];
return TRUE;
}
@end
不是您应该这样做,但是您可以通过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 界面指南的应用程序将不会被应用商店接受。
我刚刚回答了另一个相关问题,该问题描述了如何轻松创建自定义后退按钮,该按钮复制标准 iOS (iPhone / iPad) UI 后退栏按钮项目的外观,但允许添加其他功能。正如falconcreek 的回答所建议的那样,在backButtonPressed
方法中,只需添加:
[[self navigationController] popViewControllerAnimated:NO];