web-dev-qa-db-ja.com

CollectionViewでtableViewをスクロールするときにナビゲーションバーを非表示にしますか?

CollectionViewControllerとcollectionViewCellにはTableViewが含まれています。CollectionViewは水平レイアウトです。tableViewをスクロールするときにナビゲーションバーを非表示にします。それについて何かアイデアはありますか。

10
muhammedkasva

IOS 8以降では、使用することができます

self.navigationController?.hidesBarsOnSwipe = true

もちろん、ViewControllerがNavigationControllerに埋め込まれている必要があります。 NavigationControllerのすべての子VCはこの動作を継承するため、viewWillAppearで有効/無効にすることができます。また、絵コンテ。

Screenshot of Navigation Controller in Storyboard

23
Andy

テーブルビューをスクロールしたいときはいつでも、スクロール可能なナビゲーションバーにいくつかのgitライブラリを使用できます。上から下へスクロールします。

このライブラリをこのように使用するには、このコードのようにここで使用できます

Swift

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

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

目的-C

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

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

スクロールとナビゲーションに関連するこれらすべてを管理するのに役立ついくつかのデリゲートメソッドがあります。

AMScrollingNavbar参照するにはここをクリック

enter image description here

これはあなたの役に立つと思います。

15
Anand Nimje

これを試して:

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

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

[self.navigationController setNavigationBarHidden:NO animated:YES];を再度貼り付けることを忘れないでください。

at-ビューが表示されなくなるか、コントローラーが別のビューに移動するたびに、次のビューコントローラーのナビゲーションバーが表示されなくなることがあります。

5
Vaibhav Gaikwad

Naoの答えに加えて:

Scrollviewの高さが十分に小さくない場合、Navigationbarが非表示になったときにスクロールできないscrollviewが発生します。また、scrollviewがスクロール不能になった場合、この関数は呼び出されず、ナビゲーションバーは永久に消えます。

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