在通过 NavigationControllerDelegate 进行交互式转换期间隐藏/取消隐藏导航栏的正确方法是啥?
Posted
技术标签:
【中文标题】在通过 NavigationControllerDelegate 进行交互式转换期间隐藏/取消隐藏导航栏的正确方法是啥?【英文标题】:What is correct way to hide/unhide nav bar during an interactive transition via NavigationControllerDelegate?在通过 NavigationControllerDelegate 进行交互式转换期间隐藏/取消隐藏导航栏的正确方法是什么? 【发布时间】:2015-07-21 12:49:15 【问题描述】:这与我的另一个问题ios 8 + interactive transition + nav bar shown = broken? 有关,但有所不同。
在 iOS 8 上,当通过NavigationControllerDelegate
/ UIViewControllerInteractiveTransitioning
方法从视图 A 到视图 B 进行交互转换时,视图 A 有导航栏,而视图 B 没有,那么正确的方法是什么隐藏/取消隐藏导航栏?
我尝试在 ViewController 中这样做:
- (void)viewWillAppear:(BOOL)animated
[super viewWillAppear:animated];
[[self transitionCoordinator] animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context)
if (self.navigationController)
[self.navigationController setNavigationBarHidden:YES animated:animated];
completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
NSArray *debugViews = [context containerView].subviews;
NSLog(@"%@", debugViews);
if ([context isCancelled] )
if( self.navigationController )
[self.navigationController setNavigationBarHidden:NO animated:animated];
];
- (void)viewWillDisappear:(BOOL)animated
[[self transitionCoordinator] animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context)
if (self.navigationController)
[self.navigationController setNavigationBarHidden:NO animated:animated];
completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
if ([context isCancelled] )
if( self.navigationController )
[self.navigationController setNavigationBarHidden:YES animated:animated];
];
[super viewWillDisappear:animated];
...但是有两个大问题:
动画完成时,视图(主要是导航栏)有时会“闪烁”。如果你在下面有一个复杂的视图,这真的很难看。
如果用户取消了交互转换(即没有拖得足够远或捏得不够),那么导航栏就会永远消失,即使我可以在代码中看到它被告知取消隐藏。
这里有一些显示这种情况的源代码:https://github.com/xaphod/UIViewControllerTransitionTut
--> 松开以从一个视图控制器转到另一个;第一个视图有一个导航栏,第二个没有。完成过渡后,有时会看到闪烁(上面的问题 1)。当您松开一点点并松开时,这是一个取消的过渡:虽然您仍在视图 1 上,但导航栏已经消失(上面的问题 2)。
【问题讨论】:
【参考方案1】:隐藏导航栏的正确方法是使用 Navigation 的控制器委托,请确保在使用以下委托方法之前将窗口的导航控制器委托设置为 self:-
只需在 AppDelegate.m 中执行此操作
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
self.window.rootViewController.navigationController.delegate=self;
//do your rest code...
-(void)navigationController:(UINavigationController *)navController
willShowViewController:(UIViewController *)viewController
animated:(BOOL)animated
[navController setNavigationBarHidden:([viewController isKindOfClass:[CustomViewController class]])
animated:animated]; // just mention the view controller class type for which you want to hide
引用自此SFO's
【讨论】:
【参考方案2】:如果您想特别隐藏导航栏viewcontroller
,您可以在 wilAppear 中使用此方法。
//Unhide
-(void)viewWillAppear:(BOOL)animated
self.navigationController.navigationBarHidden = NO;
//Hide
-(void)viewWillAppear:(BOOL)animated
self.navigationController.navigationBarHidden = YES;
【讨论】:
以上是关于在通过 NavigationControllerDelegate 进行交互式转换期间隐藏/取消隐藏导航栏的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
移动端通过ajax上传图片(文件)并在前台展示——通过H5的FormData对象
在c / c ++中何时通过引用传递以及何时通过值传递[重复]
在Android Emulator中没有连接互联网,当通过热点通过手机上网时
通过 Faye 在 Rails 应用程序上进行实时聊天,但通过 Apache 在乘客上进行实时聊天