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触发手势识别器)然后通过向上或向下对角线的动作结束...
有人为此提供了一个干净的解决方案吗?
答案 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>