【问题标题】:How to hide a navigation bar from first ViewController in Swift?如何在 Swift 中隐藏第一个 ViewController 的导航栏?
【发布时间】:2015-05-26 09:30:18
【问题描述】:

如何快速隐藏第一个 ViewController 或特定 ViewController 的导航栏?

我在viewDidLoad()中使用了以下代码:

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationController?.isNavigationBarHidden = true
}

还有viewWillAppear:

override func viewWillAppear(animated: Bool) {
    self.navigationController?.isNavigationBarHidden = true
}

这两种方法都对所有 ViewController 隐藏了导航控制器。

【问题讨论】:

  • 您需要为所有视图控制器手动管理它..您不能为任何一个..

标签: ios swift uinavigationcontroller uinavigationbar


【解决方案1】:
     private func setupView() {
            view.backgroundColor = .white
            navigationController?.setNavigationBarHidden(true, animated: false)
        }

另类

在 viewDidLoad 中使用此设置

title = "Madman"
navigationController?.isNavigationBarHidden = false
navigationController?.navigationBar.prefersLargeTitles = true
navigationItem.largeTitleDisplayMode = .always

检查Collectionview、scrollview或tableView的约束

 NSLayoutConstraint.activate([
            tableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
            tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
            tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor)
        ])

【讨论】:

    【解决方案2】:
        /*.  Swift 5  */     
        let controller =  self.storyboard?.instantiateViewController(withIdentifier: "sc_userNavigation") as! UserNavigationViewController
        let navigationController = UINavigationController(rootViewController: controller)
        navigationController.setNavigationBarHidden(true, animated: false)
        navigationController.modalPresentationStyle = .fullScreen
        self.present(navigationController, animated: false, completion: nil)
    

    【讨论】:

      【解决方案3】:

      您也可以为此创建一个扩展,这样您就可以重用该扩展,而无需在每个视图控制器中一次又一次地实现它。

      import UIKit
      
      extension UIViewController {
          func hideNavigationBar(animated: Bool){
              // Hide the navigation bar on the this view controller
              self.navigationController?.setNavigationBarHidden(true, animated: animated)
      
          }
      
          func showNavigationBar(animated: Bool) {
              // Show the navigation bar on other view controllers
              self.navigationController?.setNavigationBarHidden(false, animated: animated)
          }
      
      }
      

      所以你可以使用下面的扩展方法

          override func viewWillAppear(_ animated: Bool) {
              super.viewWillAppear(animated)
              hideNavigationBar(animated: animated)
          }
      
          override func viewWillDisappear(_ animated: Bool) {
              super.viewWillDisappear(animated)
              showNavigationBar(animated: animated)
          }
      

      【讨论】:

      • 不值得扩展,是吗? :)
      • 取决于您隐藏/显示导航栏的视图数量。我觉得大多数情况下你只隐藏第一个,但如果你经常这样做,扩展很好。
      • 当然,这不值得。不要发明已经存在的东西。
      【解决方案4】:

      在视图中调用set hide方法会出现和消失。如果您不调用视图中的方法,则会以状态 false 消失。它将在完整的导航层次结构中隐藏导航栏

       override func viewWillAppear(_ animated: Bool) {
          super.viewWillAppear(animated)
          self.navigationController?.setNavigationBarHidden(true, animated: true)
      }
      
      override func viewWillDisappear(_ animated: Bool) {
          super.viewWillDisappear(animated)
          self.navigationController?.setNavigationBarHidden(false, animated:true)
      }
      

      【讨论】:

      • 这是一个复制/粘贴响应。您的回答与此处其他 2 或 3 个相等的回答有什么区别??
      【解决方案5】:

      如果您知道所有其他视图都应该使该栏可见,则可以使用viewWillDisappear 将其再次设置为可见。

      在斯威夫特中:

      override func viewWillAppear(_ animated: Bool) {
          super.viewWillAppear(animated)
          navigationController?.setNavigationBarHidden(true, animated: animated)
      }
      
      override func viewWillDisappear(_ animated: Bool) {
          super.viewWillDisappear(animated)
          navigationController?.setNavigationBarHidden(false, animated: animated)
      }
      

      【讨论】:

      【解决方案6】:

      在 Swift 中隐藏导航栏的方法:

      self.navigationController?.setNavigationBarHidden(true, animated: true)
      self.navigationController?.navigationBar.isHidden = true
      self.navigationController?.isNavigationBarHidden = true
      

      【讨论】:

      • self.navigationController?.setNavigationBarHidden(true, animated: true) 为我工作
      【解决方案7】:

      在 Swift 中显示导航栏的方式:

      self.navigationController?.setNavigationBarHidden(false, animated: true)
      self.navigationController?.navigationBar.isHidden = false
      self.navigationController?.isNavigationBarHidden = false
      

      【讨论】:

        【解决方案8】:

        我使用上述的变体,并将我的应用程序的部分隔离到嵌入到不同的 NavController 中。这样,我不必重置可见性。例如,在启动序列中非常有用。

        【讨论】:

          【解决方案9】:

          在 IOS 8 中这样做

          navigationController?.hidesBarsOnTap = true
          

          但仅当它是 UINavigationController 的一部分时

          当你想要它时让它变成假

          【讨论】:

            【解决方案10】:

            您可以从窗口控制器 (Swift3) 中执行此操作

            class WindowController: NSWindowController {
            
                override func windowDidLoad() {
                    super.windowDidLoad()
            
                    window?.titleVisibility = .hidden
                }
            }
            

            【讨论】:

            • 什么是窗口控制器?
            • 这是针对 macOS,而不是 iOS
            【解决方案11】:

            您可以在viewWillDisappear 中取消隐藏navigationController

            override func viewWillDisappear(animated: Bool)
            {
                super.viewWillDisappear(animated)
                self.navigationController?.isNavigationBarHidden = false
            }
            

            斯威夫特 3

            override func viewWillDisappear(_ animated: Bool) {
                super.viewWillDisappear(animated)
            
                self.navigationController?.setNavigationBarHidden(false, animated: animated)
            }
            

            【讨论】:

              【解决方案12】:

              在 Swift 3 中,您也可以使用 isNavigationBarHidden 属性来显示或隐藏导航栏

              override func viewWillAppear(_ animated: Bool) {
                  super.viewWillAppear(animated)
                  // Hide the navigation bar for current view controller
                  self.navigationController?.isNavigationBarHidden = true;
              }
              
              override func viewWillDisappear(_ animated: Bool) {
                  super.viewWillDisappear(animated)
                  // Show the navigation bar on other view controllers
                 self.navigationController?.isNavigationBarHidden = false;
              }
              

              【讨论】:

                【解决方案13】:

                斯威夫特 3

                override func viewWillAppear(_ animated: Bool) {
                    super.viewWillAppear(animated)
                
                    // Hide the navigation bar on the this view controller
                    self.navigationController?.setNavigationBarHidden(true, animated: animated)
                }
                
                override func viewWillDisappear(_ animated: Bool) {
                    super.viewWillDisappear(animated)
                
                    // Show the navigation bar on other view controllers
                    self.navigationController?.setNavigationBarHidden(false, animated: animated)
                }
                

                【讨论】:

                • 使用覆盖不要忘记调用超级方法:super.viewWillAppear(animated) 和 super.viewWillDisappear(animated)
                • 它会删除回复的链接吗?
                • 我确信它不能很好地与视觉级别的“向后滑动”一起工作,但一切都很好。谢谢!
                • 旁注:self. 不需要。
                • 在往回滑动时,从带有导航栏的视图到带有隐藏导航栏的视图,我们如何重新实现导航栏淡入淡出?
                猜你喜欢
                • 2020-07-04
                • 1970-01-01
                • 2021-03-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-07-21
                相关资源
                最近更新 更多