2015-07-21 8 views
6

Jest to związane z innym moim pytaniem, iOS 8 + interactive transition + nav bar shown = broken?, ale jest inne.Jaki jest prawidłowy sposób ukrywania/odkrywania paska nawigacji podczas interaktywnego przejścia za pomocą elementu NavigationControllerDelegate?

Na iOS 8, gdy użytkownik dokonuje interaktywnego przejścia z widoku A do widoku B za pomocą metody NavigationControllerDelegate/UIViewControllerInteractiveTransitioning, a widok A ma pasek nawigacji, a widok B NIE, to jaka jest właściwa metoda ukrywania/odkryć pasek nawigacji?

starałem się zrobić to w ViewController tak:

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

... ale istnieją dwa duże problemy:

  1. Widok (głównie navbar) "miga" czasami po zakończeniu animacji. To jest naprawdę brzydkie, jeśli pod spodem masz złożony widok.

  2. Jeśli użytkownik anuluje interaktywne przejście (tj. Nie przeciągając wystarczająco daleko lub szczypiąc wystarczająco), wówczas pasek nawigacyjny zniknie na zawsze, mimo że widzę w kodzie, który ma mu pokazać.

Oto Soure-kod aby pokazać to dzieje: https://github.com/xaphod/UIViewControllerTransitionTut

-> un-pinch, aby przejść z jednego kontrolera widoku do drugiego; pierwszy widok ma pasek nawigacji, a drugi nie. Po zakończeniu przejścia możesz czasami zobaczyć migotanie (problem 1 powyżej). Gdy odsuniesz odrobinę i puścisz, jest to anulowane przejście: mimo że wciąż widzisz 1, pasek nawigacyjny zniknął (problem 2 powyżej).

Odpowiedz

1

Właściwy sposób, aby ukryć pasek nawigacyjny będzie używać kontrolera nawigacyjnego delegata, upewnij się, że ustawienia sterownika Nawigacja Okno na delegata do siebie przed zastosowaniem następującej metody delegata: -

Wystarczy zrobić to w 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 
} 

Zaproszony od tego SFO's

0

Jeśli chce ukryć pasek nawigacyjny w szczególności viewcontroller ty może u se tę metodę w wilAppear.

Powiązane problemy