当UITableView嵌入到UIPageViewController中时,如何使用hidesBarsOnSwipe来隐藏NavigationBar?

时间:2016-08-29 06:33:31

标签: ios swift uitableview cocoa-touch uinavigationcontroller

Apple添加了这个hidesBarsOnSwipe帮助器,当我们在项目列表中向上和向下滚动时,它非常适合触发NavigationBar隐藏/显示操作。

我有一个内部有很多tableView的UIPageViewController。 我想以与我在UITableView中向上/向下滚动时hidesBarsOnSwipe完全相同的方式显示/隐藏导航栏

不幸的是,当我在UITableView类中设置以下代码时:

  rootNavViewCtrl?.hidesBarsOnSwipe = true
  rootNavViewCtrl?.barHideOnSwipeGestureRecognizer.addTarget(self, action: #selector(didHideOnSwipe))

  func didHideOnSwipe() {
    log.debug("==== hide on swipe ====")
  }

它不会触发该功能。 它实际上只在我开始水平滚动滑动时触发该功能(我猜UIPageViewController触发手势识别器)然后通过向上或向下对角线的动作结束...

有人为此提供了一个干净的解决方案吗?

1 个答案:

答案 0 :(得分:1)

您可以将此代码转换为Swift。我提供的是Obj-C语法。

在包含tableView的视图控制器中,覆盖几个UIScrollView委托:

BOOL canHideOrShowNavBar;
NSInteger lastContentOffset;

 #pragma mark - UIScrollView Delegate
-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (self.lastContentOffset > scrollView.contentOffset.y && canHideOrShowNavBar){
        if(self.parentViewController.navigationController.navigationBarHidden){
            [self.parentViewController.navigationController setNavigationBarHidden:NO animated:YES];
        }
    }else if (self.lastContentOffset < scrollView.contentOffset.y && canHideOrShowNavBar){
        if(!self.parentViewController.navigationController.navigationBarHidden){
            [self.parentViewController.navigationController setNavigationBarHidden:YES animated:YES];
        }
    }
    self.lastContentOffset = scrollView.contentOffset.y;
}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    canHideOrShowNavBar = YES;
}

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
                 withVelocity:(CGPoint)velocity
          targetContentOffset:(inout CGPoint *)targetContentOffset {
    canHideOrShowNavBar = NO;
}

- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView {
    if([self.parentViewController.navigationController isNavigationBarHidden])
        [self.parentViewController.navigationController setNavigationBarHidden:NO animated:YES];
    return YES;
}

如果UIPageViewController下有多个视图控制器,它们也有UITableView,你可以将这些代码放在你的基础UIViewController子类中,以防止出现冗余。

与此同时,我希望有人也可以告诉我为什么当UITableView位于UIPageViewController中的childViewController内时 hidesBarsOnSwipe 无效。

UINavigationController //Initiate
  | 
UIPageViewController 
  |                   |                   |
UIViewControllerA   UIViewControllerB   UIViewControllerC
  |             ↘
UITableView  // <self.navigationController.canHideOrShowNavBar = YES; is not working when scrolling UITableView>