【问题标题】:Show/hide navigationBar when view is pushed/popped in iOS 8在 iOS 8 中推送/弹出视图时显示/隐藏导航栏
【发布时间】:2014-11-10 01:59:57
【问题描述】:

各位开发者,

我很惊讶我没有找到有关 iOS 8 特定用例的任何信息。让我解释一下,我有一个导航控制器堆栈,当用户单击一个单元格时,第一个视图隐藏了它的导航栏推送了一个新视图,我需要此视图上显示的导航栏返回(显然)。在 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 我需要显示的任何内容。它会起作用,但在 * 中确实很痛苦(如果用户来自新的视图控制器,有时内容插入不是必需的)。

就上下文而言,该项目最初是为处理 iOS 6 和 7 而开发的,因此没有情节提要,一切都是以编程方式完成的。我将应用程序移植到更现代的代码库并使其具有通用性。

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

【问题讨论】:

  • 我们遇到了同样的问题。不过,iOS 8.1 似乎已经解决了这个问题。
  • 我在 iOS 8 中遇到了与 UIPageViewController 类似的问题。如果您有任何关于问题的建议,请告诉我。您可以在下面访问我的问题线程。 stackoverflow.com/questions/27420396/…

标签: ios ios7 uinavigationcontroller uinavigationbar ios8


【解决方案1】:

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

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 它是如何工作的以及我为什么构建它。

【讨论】:

    【解决方案2】:

    您想在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
    }
    

    【讨论】:

      【解决方案3】:

      iOS 8 上,似乎navigationBarHiddennavigationBar.hidden 不一样。 (我正在使用部署目标 iOS 6 进行构建——不确定这是否会有所不同)。

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

      bool b1 = self.navigationController.navigationBarHidden; // FALSE
      
      bool b2 = self.navigationController.navigationBar.hidden; // TRUE
      

      b1 显示为假,b2 显示为真。

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

      【讨论】:

      • 我在点头。 [self.navigationController setNavigationBarHidden:YES];在我的 viewWillAppear 方法中,它本身正在 iOS8.4 上工作以隐藏导航栏。这个错误刚刚出现在我的代码中。以前(例如,在 iOS8.4 之前)我使用的是 navController.navigationBar.hidden = YES;在 viewWillAppear 之前,它起作用了。但不是现在。
      • 这为我使用 iOS 8.0 及更高版本完成了
      【解决方案4】:

      做这个动画以获得平滑的过渡:

      - (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 奇怪的是,我希望动画会有所不同...多么奇怪
      【解决方案5】:

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

      [self.navigationController setNavigationBarHidden:YES];
      

      我想,检查这个问题的其他人犯了我的错误,所以我认为它可能值得一提。

      【讨论】:

        【解决方案6】:

        我认为行是:

        self.navigationController.navigationBar.hidden = YES;
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-12
          • 2011-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多