在iOS 8中按/弹出视图时显示/隐藏导航栏

时间:2014-09-16 10:47:09

标签: ios ios7 uinavigationcontroller uinavigationbar ios8

嗨其他开发者,

我很惊讶我没有找到关于iOS 8特定用例的任何信息。让我解释一下,我有一个导航控制器堆栈,当用户点击一个单元格时,第一个视图隐藏了navigationBar推送新视图,我需要此视图上显示的导航栏返回(显然)。在iOS 7上,只需在viewWillAppear中添加此行:

 [self.navigationController setNavigationBarHidden:NO animated:YES];

它就像一个魅力。但是从iOS 8开始,我很难有同样的行为。现在我设法通过使用:

来做同样的事情
- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))
        [self.navigationController setNavigationBarHidden:NO animated:NO];
}
- (void)viewDidLoad {
     [super viewDidLoad];
     if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
         self.automaticallyAdjustsScrollViewInsets = NO;
         self.edgesForExtendedLayout = UIRectEdgeNone;
         self.collectionView.contentInset = UIEdgeInsetsMake(self.navigationController.navigationBar.frame.size.height, 0, 0, 0);
}    }

更改我的collectionsView / tableviews的contentInset,无论我需要显示什么。它会起作用,但它在 * 中真的很痛苦(如果用户来自新的viewcontroller,有时内容插入不是必需的。)

对于上下文,项目最初是为处理iOS 6和7而开发的,所以没有故事板,所有都是以编程方式完成的。我将应用程序移植到更现代的代码库中并使其具有通用性。

我错过了什么吗?在iOS 7/8中有更好的方法来处理它吗?

6 个答案:

答案 0 :(得分:13)

您希望在viewWillAppear中隐藏它并在viewWillDisappear

中再次显示
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.navigationBar.isHidden = true
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    navigationController?.navigationBar.isHidden = false
}

答案 1 :(得分:9)

我以为行是:

self.navigationController.navigationBar.hidden = YES;

我检查它,它对我来说很好。 。 。 试试吧 。 。

答案 2 :(得分:9)

动画这样做是为了顺利过渡:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.navigationController setNavigationBarHidden:YES animated:YES];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [self.navigationController setNavigationBarHidden:NO animated:YES];
}

答案 3 :(得分:7)

iOS 8上,似乎navigationBarHiddennavigationBar.hidden不同。 (我正在构建部署目标iOS 6 - 不确定这是否有所不同。)

在我的代码中,使用以下连续行查看调试器:

bool b1 = self.navigationController.navigationBarHidden; // FALSE

bool b2 = self.navigationController.navigationBar.hidden; // TRUE

b1显示为false,b2显示为true。

设置self.navigationController.navigationBar.hidden = false解决问题

答案 4 :(得分:4)

我有同样的问题,我真的尝试了一切,但导航栏没有出现。最后我意识到我在第一个视图控制器中有这个代码: - )

[self.navigationController setNavigationBarHidden:YES];

我想,其他人检查这个问题,我犯了错误,所以我觉得值得一提。

答案 5 :(得分:0)

有多种技术。摩擦较小的是:

open class ViewController: UIViewController {
  open var hidesNavigationBarWhenPushed = false

  override open func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.setNavigationBarHidden(hidesNavigationBarWhenPushed, animated: animated)
  }
}

但这会给你这个result

或者,我建议使用我新建的HidesNavigationBarWhenPushed libraryHere is the explanation了解它的工作原理以及为什么要构建它。