UINavigationController子视图不滚动

时间:2017-11-30 12:07:20

标签: ios objective-c uiview uinavigationcontroller uinavigationbar

我有导航控制器和视图,我附加到导航控制器的子视图,我使用下面的代码在向上滑动时隐藏导航栏

    [self.navigationController.view addSubview: categoryView];
    self.navigationController.hidesBarsOnSwipe = YES;

它在向上滑动桌面时隐藏到顶部,但我希望该子视图应该与导航控制器一起向上移动,它应该适合顶部,而向下滑动导航栏应该与子视图一起下降。 / p>

我试过这个

[self.navigationController.navigationBar addSubview: categoryView];

在这个中,navigationBar和子视图都隐藏在顶部。我想一些简单的解决方案就在那里,我搜索了很多,但没有找到一个完美的解决方案。我也尝试了一些库,这些库不适合iPhone X并且在iOS 11中存在一些问题。

更新:为问题before scrolling添加图片 和 after scrolling the tableview

5 个答案:

答案 0 :(得分:1)

编辑:

您可以使用安全区域的约束将子视图添加到视图中。

F.e。以编程方式:

self.headerView.translatesAutoresizingMaskIntoConstraints = NO;
self.tableView.translatesAutoresizingMaskIntoConstraints = NO;
if (@available(iOS 11.0, *)) {
    self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
    UILayoutGuide *guide = self.view.safeAreaLayoutGuide;
    [NSLayoutConstraint activateConstraints:@[
                                              [self.headerView.topAnchor constraintEqualToAnchor:self.view.topAnchor constant:0],
                                              [self.headerView.bottomAnchor constraintEqualToAnchor:guide.topAnchor constant:64],
                                              [self.headerView.leftAnchor constraintEqualToAnchor:self.view.leftAnchor constant:0],
                                              [self.headerView.rightAnchor constraintEqualToAnchor:self.view.rightAnchor constant:0]
                                              ]];
    [NSLayoutConstraint activateConstraints:@[
                                              [self.tableView.topAnchor constraintEqualToAnchor:self.headerView.bottomAnchor constant:0],
                                              [self.tableView.leftAnchor constraintEqualToAnchor:self.view.leftAnchor constant:0],
                                              [self.tableView.rightAnchor constraintEqualToAnchor:self.view.rightAnchor constant:0],
                                              [self.tableView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor constant:0]
                                              ]];


}

要在滚动时显示/隐藏导航栏,您可以使用:

if (scrollView.contentOffset.y <= 0) {
    [self.navigationController setNavigationBarHidden:NO animated: YES];
} else {
    [self.navigationController setNavigationBarHidden:YES animated: YES];
}
[UIView animateWithDuration:[CATransaction animationDuration]
                 animations:^{
                     [self.view layoutIfNeeded];
                 }];

enter image description here

更新示例:https://github.com/josshad/HideNavBarOnScrollExample

答案 1 :(得分:0)

viewDidLoad

中编写此代码
[self.navigationController setNavigationBarHidden:YES];

https://stackoverflow.com/a/47081269/8125593

答案 2 :(得分:0)

func scrollViewDidScroll(_ scrollView: UIScrollView) {
  if scrollView.contentOffset.y <= 0 {
    [self.navigationController setNavigationBarHidden:NO];
  } else {
    [self.navigationController setNavigationBarHidden:YES];
  }
}

试试这个。

答案 3 :(得分:0)

使用自定义视图作为标题视图而不是使用导航栏(隐藏导航栏)。现在为标题View(高度约束)提供约束。滚动表格视图时,将调用方法-scrollViewDidScroll。检查scrollview的内容偏移量,如果它大于0。

headerView.heightconstraint -= scrollViewContentoffset.y;

before scrolling after scrolling

答案 4 :(得分:0)

在LetsBuildThatApp Youtube频道上关注Brian Voong的精彩教程。他用可怕的细节解释了你所指的相同功能。

NavBarView Sliding Feature

希望这会有所帮助..