在CollectionView中滚动tableView时隐藏NavigationBar?

时间:2016-06-23 09:02:19

标签: ios swift uitableview uicollectionview uinavigationbar

我有collectionViewController和collectionViewCell包含TableView.CollectionView是水平布局。我想在滚动tableView时隐藏导航栏。有没有任何想法。

7 个答案:

答案 0 :(得分:22)

从iOS 8开始,你可以使用

self.navigationController?.hidesBarsOnSwipe = true

当然,这需要您的ViewController嵌入在NavigationController中。 NavigationController的所有子VC都将继承此行为,因此您可能希望在viewWillAppear中启用/禁用它。 您还可以在故事板中的导航控制器上设置相应的标志。

Screenshot of Navigation Controller in Storyboard

答案 1 :(得分:13)

每当您想要滚动表格视图时,您可以使用一些git库进行滚动导航栏。滚动顶部到底部/底部到顶部它会自动调整导航栏。

您可以像这样使用此代码来使用此库

夫特

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 click here for see

enter image description here

我认为这对你有帮助。

答案 2 :(得分:5)

创建一个 @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 - viewwilldisappear或控制器移动到另一个控制器,因为这可能导致下一个视图控制器导航栏消失。

答案 3 :(得分:4)

试试这个:

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

在nao的答案之上:

如果scrollview高度不够小,则在隐藏导航栏时将导致不可滚动的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)
            }
        }
    }

答案 6 :(得分:0)

其他解决方案有一个错误,如果您将手指从屏幕上抬起并再次按住,则会出现 navController...

这个方法更好:

// Show/Hide the NavigationBar when scrolling
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.contentOffset.y > -48 {
        navigationController?.setNavigationBarHidden(true, animated: true)
    } else {
        navigationController?.setNavigationBarHidden(false, animated: true)
    }
}