在通过 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 在乘客上进行实时聊天

通过数组排序以通过 jQuery 将代码放置在适当的 div 中

是否可以通过在 iOS 上通过企业分发分发应用程序来测试应用内订阅真实?