【问题标题】:How to use hidesBarsOnSwipe to hide the NavigationBar when UITableView is embedded into a UIPageViewController?当 UITableView 嵌入到 UIPageViewController 中时,如何使用 hidesBarsOnSwipe 隐藏 NavigationBar?
【发布时间】:2017-01-05 02:35:40
【问题描述】:

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

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

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

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

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

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

有人对此有干净的解决方案吗?

【问题讨论】:

  • 你解决了吗?我们已经坚持了好几天了..
  • 当时我最终没有将它隐藏在滚动条上,我不知道建议的解决方案是否 100% 工作正常,但从我读到的内容来看,它应该工作良好。我只是不确定尝试上下滚动时动画是否流畅。另外,当切换到另一个水平页面时,它不会出错吗?如果你能测试他提出的代码并粘贴一个快速的解决方案,那就太好了。

标签: ios swift uitableview cocoa-touch uinavigationcontroller


【解决方案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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 2017-12-09
    • 2021-09-30
    • 2020-12-01
    • 2014-12-01
    • 1970-01-01
    相关资源
    最近更新 更多