2015-07-21 3 views
6

Dies steht im Zusammenhang mit einer anderen Frage von mir, iOS 8 + interactive transition + nav bar shown = broken?, ist aber anders.Was ist die korrekte Art, Nav-Balken während eines interaktiven Übergangs über NavigationControllerDelegate ein-/auszublenden?

Auf iOS 8, wenn man einen interaktiven Übergang von der Ansicht A tut B über die NavigationControllerDelegate/UIViewControllerInteractiveTransitioning Verfahren und Ansicht A zu betrachten, hat eine navbar und Ansicht B, dann nicht, was ist die richtige Methode zu verstecken/die Nav-Leiste ausblenden?

Ich habe versucht, diese in den Viewcontroller wie dies zu tun:

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

... aber es gibt zwei große Probleme:

  1. Der Blick (vor allem der navbar) "flackert" manchmal wenn die Animation abgeschlossen ist. Das ist wirklich hässlich, wenn Sie darunter eine komplexe Ansicht haben.

  2. Wenn der Benutzer den interaktiven Übergang abbricht (zB indem er nicht weit genug zieht oder genug kneift), verschwindet die Navigationsleiste für immer, obwohl ich im Code sehen kann, dass es eingeblendet wird.

Hier einiger soure-Code dies zu zeigen: https://github.com/xaphod/UIViewControllerTransitionTut

-> un-Prise von einem View-Controller zu einem anderen zu gehen; Die erste Ansicht hat eine Navigationsleiste, die zweite keine. Wenn Sie den Übergang abgeschlossen haben, können Sie manchmal Flimmern sehen (Problem 1 oben). Wenn Sie nur ein kleines bisschen loslassen und loslassen, ist das ein abgebrochener Übergang: Obwohl Sie immer noch auf Ansicht 1 sind, ist die Navigationsleiste verschwunden (Problem 2 oben).

Antwort

1

Der richtige Weg, um die Navigationsleiste zu verbergen Navigation des Controllers Delegierten zu verwenden sein, stellen Sie sicher, dass Sie das Fenster des Navigationscontroller Delegaten selbst einstellen, bevor Sie den folgenden Delegatmethode mit: -

tun genau dies im 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 
} 

von diesem Geworben SFO's

0

Wenn Sie will Navigationsleiste insbesondere viewcontroller verstecken Sie können u se diese Methode in wilAppear.

//Unhide 

-(void)viewWillAppear:(BOOL)animated 
{ 
    self.navigationController.navigationBarHidden = NO; 

} 

//Hide 

-(void)viewWillAppear:(BOOL)animated 
{ 
    self.navigationController.navigationBarHidden = YES; 

}