web-dev-qa-db-fra.com

Masquer la barre de navigation lors du défilement de tableView dans CollectionView?

J'ai collectionViewController et collectionViewCell incluent TableView.CollectionView est une disposition horizontale. Je veux masquer la barre de navigation lorsque vous faites défiler la tableView. Y a-t-il une idée à ce sujet?.

10
muhammedkasva

Depuis iOS 8, vous pouvez simplement utiliser

self.navigationController?.hidesBarsOnSwipe = true

Cela nécessite bien sûr que votre ViewController soit intégré dans un NavigationController. Tous les enfants VC du NavigationController hériteront de ce comportement, vous pouvez donc l'activer/le désactiver dans viewWillAppear. Vous pouvez également définir les indicateurs respectifs sur le contrôleur de navigation dans le storyboard.

Screenshot of Navigation Controller in Storyboard

23
Andy

Vous pouvez utiliser certaines bibliothèques git pour la barre de navigation défilable chaque fois que vous souhaitez faire défiler la vue de votre tableau/Faire défiler de haut en bas/de bas en haut, cela ajustera automatiquement votre barre de navigation.

vous pouvez utiliser ici comme ce code pour utiliser cette bibliothèque comme celle-ci

Swift

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    if let navigationController = self.navigationController as? ScrollingNavigationController {
        navigationController.followScrollView(tableView, delay: 50.0)
    }
}

Objectif c

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [(ScrollingNavigationController *)self.navigationController followScrollView:self.tableView delay:50.0f];
}

Il a quelques méthodes de délégué pour gérer tout cela lié au défilement et à la navigation.

AMScrollingNavbar cliquez ici pour voir

enter image description here

Je pense que cela vous est utile.

15
Anand Nimje

Essaye ça:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.panGestureRecognizer.translation(in: scrollView).y < 0 {
        navigationController?.setNavigationBarHidden(true, animated: true)
    } else {
        navigationController?.setNavigationBarHidden(false, animated: true)
    }
}
8
nao

créer un @property (assign, nonatomic) CGFloat currentOffset;

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    scrollView = self.collectionProductView;
   _currentOffset = self.collectionProductView.contentOffset.y;

}

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{

    CGFloat scrollPos = self.collectionProductView.contentOffset.y ;

    if(scrollPos >= _currentOffset ){
        //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];
    }
}

N'oubliez pas de coller à nouveau [self.navigationController setNavigationBarHidden: NO animated: YES];

at - view disparaîtra ou chaque fois que le contrôleur se déplace vers un autre, car cela pourrait faire disparaître la barre de navigation du contrôleur de vue suivante.

5
Vaibhav Gaikwad

En plus de la réponse de nao:

Si la hauteur de la vue de défilement n'est pas assez petite, cela provoquera une vue de défilement non défilable lorsque la barre de navigation est masquée. Et si scrollview ne peut plus défiler, cette fonction n'est pas appelée et la barre de navigation a disparu pour toujours

func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let height = view.safeAreaLayoutGuide.layoutFrame.size.height
        let scrolled = scrollView.panGestureRecognizer.translation(in: scrollView).y
        if !(scrollView.visibleSize.height - height >= 90) {
            if  scrolled < 0 {
                navigationController?.setNavigationBarHidden(true, animated: true)
            } else {
                navigationController?.setNavigationBarHidden(false, animated: true)
            }
        }
    }
0
Yunus Güngör
 func scrollViewDidScroll(_ scrollView: UIScrollView)
       {
           //  var navigationBarFrame   = self.navigationController!.navigationBar.frame
           let currentOffset = scrollView.contentOffset

           if (currentOffset.y > (self.lastContentOffset?.y)!) {
               if currentOffset.y > 0 {
                   initial = initial - fabs(CGFloat(currentOffset.y - self.lastContentOffset!.y))
               }
               else if scrollView.contentSize.height < scrollView.frame.size.height {
                   initial = initial + fabs(CGFloat(currentOffset.y - self.lastContentOffset!.y))
               }
           }
           else {
               if currentOffset.y < scrollView.contentSize.height - scrollView.frame.size.height {
                   initial = initial + fabs(CGFloat(currentOffset.y - self.lastContentOffset!.y))
               }
               else if scrollView.contentSize.height < scrollView.frame.size.height && initial < maxPlus {
                   initial = initial - fabs(CGFloat(currentOffset.y - self.lastContentOffset!.y))
               }
           }

           if (initial <= maxMinus){
               initial =  maxMinus
               self.tableviewTopConstrin.constant = 0
               UIView.animate(withDuration: 0.4, animations: {
                   self.view.layoutIfNeeded()
               })

           }else if(initial >= maxPlus){
               initial = maxPlus
               self.tableviewTopConstrin.constant = 70
               UIView.animate(withDuration: 0.4, animations: {
                   self.view.layoutIfNeeded()
               })
           }else{
           }
           self.lastContentOffset = currentOffset;
       }
0
Mahesh Joya