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:
Widok (głównie navbar) "miga" czasami po zakończeniu animacji. To jest naprawdę brzydkie, jeśli pod spodem masz złożony widok.
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).