Mostrar la barra de navigation al desplazarse hacia arriba. IOS

Actualmente tengo una UICollection en la que UINavigation la UINavigation superior de UINavigation cuando te desplazas 40px. La UINavigation superior UINavigation aparece de nuevo cuando se desplaza hacia atrás hasta la parte superior.

Esto funciona sin embargo, quiero poder mostrar UINavigation ocultar la UINavigation superior de UINavigation cada vez que el usuario se desplaza 40px y no solo cuando se desplaza desde la parte superior.

Por ejemplo, cuando comienza a desplazarse desde la parte superior, la barra se esconde, se desplaza hasta el centro de la UICollectionView y luego, cuando intenta volver a desplazarse hacia la parte superior, la UINavigation superior de UINavigation vuelve a UINavigation .

¿Algunas ideas?

 #pragma mark - UIScrollViewDelegate Methods -(void)scrollViewDidScrollToTop:(UIScrollView *)scrollView { if([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0f){ return; } CGRect frame = self.navigationController.navigationBar.frame; frame.origin.y = 20; } -(void)scrollViewDidScroll:(UIScrollView *)scrollView { if([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0f){ return; } CGFloat offsetY = scrollView.contentOffset.y; CGFloat contentHeight = scrollView.contentSize.height - 300; if (offsetY > contentHeight - scrollView.frame.size.height) { [self.homePaginator fetchNextPage]; } CGRect frame = self.navigationController.navigationBar.frame; CGFloat size = frame.size.height - 25; if([scrollView.panGestureRecognizer translationInView:self.view].y < 0) { frame.origin.y = -size; if(self.navigationController.navigationBar.items.count > 0){ [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction animations:^{ CGFloat navBarHeight = 25.0f; CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight); [self.navigationController.navigationBar setFrame:frame]; } completion:^(BOOL finished) { self.navigationItem.titleView.alpha = 0; self.piccingTitleIcon.alpha = 0; self.navigationItem.rightBarButtonItem = nil; }]; } } else if([scrollView.panGestureRecognizer translationInView:self.view].y > 0) { [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction animations:^{ CGFloat navBarHeight = 64.0f; CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight); [self.navigationController.navigationBar setFrame:frame]; self.navigationItem.titleView.alpha = 1; self.piccingTitleIcon.alpha = 1; self.btnSearch = [[UIBarButtonItem alloc] initWithCustomView:self.searchIconButton]; [self.navigationItem setRightBarButtonItem:self.btnSearch]; } completion:^(BOOL finished) { [self performSelector:@selector(addIconsToNavBar) withObject:nil afterDelay:-1.0]; }]; } } 

¡Prueba esto!

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGPoint scrollOffset = scrollView.contentOffset; if (scrollOffset.y >= 40) { if (![self.navigationController isNavigationBarHidden]) { [self.navigationController setNavigationBarHidden:YES animated:YES]; } } else { if ([self.navigationController isNavigationBarHidden]) { [self.navigationController setNavigationBarHidden:NO animated:YES]; } } } 

Obtenga inicio de compensación de contenido antes de que el usuario se desplace.

 – scrollViewWillBeginDragging:(UIScrollView *)scrollView { currentOffset = scrollView.contentOffset.y; } -(void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat scrollPos = scrollView.contentOffset.y - currentOffset; if(scrollPos >= 40 || scrollPos <= -40 /* or whatever the height of your toolbar is */){ //Fully hide your toolbar [UIView animateWithDuration:2.25 animations:^{ [self.navigationController setNavigationBarHidden:YES animated:YES]; }]; } else { //Slide it up incrementally, etc. [self.navigationController setNavigationBarHidden:NO animated:YES]; } } 

Cualquiera que quiera saber una manera simple de hacer esto puede usar el siguiente código.

hay bibliotecas que hacen que sea fácil hacerlo, pero descubrí que tengo que volver a escribir la navigation de la aplicación con su class personalizada de UINavgationController Si tienes un proyecto existente, puedes hacerlo más fácil …

 #pragma mark - UIScrollViewDelegate Methods -(void)scrollViewDidScrollToTop:(UIScrollView *)scrollView { if([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0f){ return; } CGRect frame = self.navigationController.navigationBar.frame; frame.origin.y = 20; } -(void)scrollViewDidScroll:(UIScrollView *)scrollView { if([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0f){ return; } CGFloat offsetY = scrollView.contentOffset.y; CGFloat contentHeight = scrollView.contentSize.height - 300; if (offsetY > contentHeight - scrollView.frame.size.height) { [self.homePaginator fetchNextPage]; } CGRect frame = self.navigationController.navigationBar.frame; CGFloat size = frame.size.height - 25; if([scrollView.panGestureRecognizer translationInView:self.view].y < 0) { frame.origin.y = -size; if(self.navigationController.navigationBar.items.count > 0){ [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction animations:^{ CGFloat navBarHeight = 25.0f; CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight); [self.navigationController.navigationBar setFrame:frame]; } completion:^(BOOL finished) { self.navigationItem.titleView.alpha = 0; self.piccingTitleIcon.alpha = 0; self.navigationItem.rightBarButtonItem = nil; }]; } } else if([scrollView.panGestureRecognizer translationInView:self.view].y > 0) { [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction animations:^{ CGFloat navBarHeight = 64.0f; CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight); [self.navigationController.navigationBar setFrame:frame]; self.navigationItem.titleView.alpha = 1; self.piccingTitleIcon.alpha = 1; self.btnSearch = [[UIBarButtonItem alloc] initWithCustomView:self.searchIconButton]; [self.navigationItem setRightBarButtonItem:self.btnSearch]; } completion:^(BOOL finished) { [self performSelector:@selector(addIconsToNavBar) withObject:nil afterDelay:-1.0]; }]; } }