【问题标题】:How to hide status bar of a single view controller in iOS 9?如何在 iOS 9 中隐藏单个视图控制器的状态栏?
【发布时间】:2016-05-03 20:49:04
【问题描述】:

在我以模态方式呈现的 ViewController 中,我这样做了:

override func prefersStatusBarHidden() -> Bool {
    return true
}

这曾经有效,但不再有效。对于此视图控制器,隐藏状态栏的最佳方法是什么?

【问题讨论】:

  • 只需以编程方式检查this
  • 它仍然可以正常工作。如果您想将该功能应用于所有视图控制器,请考虑使用继承。
  • 只需转到 info.plist 并将 View 基于控制器的状态栏外观 更新为 YES,如 @lance 所述

标签: ios swift


【解决方案1】:

对于 Swift 3Swift 4,它已更改为覆盖如下变量:

override var prefersStatusBarHidden: Bool {
  return true
}

如果你想在视图控制器已经显示后“更新”状态,你需要调用:

setNeedsStatusBarAppearanceUpdate()

请参考documentation

【讨论】:

  • 在 tabbarcontroller setNeedsStatusBarAppearanceUpdate() 中不会触发 prefersStatusBarHidden
  • @famfamfam 确保在 info.plist 中没有禁用基于控制器的状态栏外观。如果你这样做,这个属性将被完全忽略。此外,PrefersStatusBarHidden 可能会在父控制器中被调用。这取决于您如何组织视图控制器。
【解决方案2】:

对于 Swift 3 和 Swift 4.2 当视图出现时

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    UIApplication.shared.isStatusBarHidden = true
}

当视图消失时

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    UIApplication.shared.isStatusBarHidden = false
}

您可能需要在 info.plist 中设置下一行:

View controller-based status bar appearance = NO

【讨论】:

  • 这是唯一对我来说效果很好的答案,完美!
  • 我相信它可以工作,因为你弄乱了 ViewController 层次结构并且系统不调用 prefersStatusBarHidden。
  • 这是我能做到的唯一方法,但我还必须将 UIViewControllerBasedStatusBarAppearance 添加到我的 info.plist 文件中
  • isStatusBarHidden 在 iOS 9.0 中已弃用
【解决方案3】:

在你的 UIViewController 中:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    UIApplication.shared.isStatusBarHidden = true
}

 override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    //It will show the status bar again after dismiss
    UIApplication.shared.isStatusBarHidden = false
}

override var prefersStatusBarHidden: Bool {
    return true
}

【讨论】:

  • 我刚用过,效果很好!谢谢你
  • “isStatusBarHidden”的设置器在 iOS 9.0 中已弃用:使用 -[UIViewController prefersStatusBarHidden]
【解决方案4】:

在 iOS 9、Xcode 7、Swift 2.0 中,它又回到了以前的样子。

override func prefersStatusBarHidden() -> Bool {
        return true
}

事实上 Xcode 会告诉你

UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .None) 

已被弃用,您应该使用 prefersStatusBarHidden 方法。

【讨论】:

  • 如果 prefersStatusBarHidden 方法不执行任何操作,请将 setNeedsStatusBarAppearanceUpdate() 添加到 viewDidLoad 或 viewDidAppear 方法中。取决于你想要达到的目标。
【解决方案5】:

对于 Swift 3,

override var prefersStatusBarHidden: Bool{
        return true
    }

并添加viewDidLoad()

self.modalPresentationCapturesStatusBarAppearance = true

【讨论】:

  • 最佳答案
【解决方案6】:

您可以通过简单地覆盖 ViewController 中的prefersStatusBarHidden 属性来实现这一点,如下所示:

override var prefersStatusBarHidden: Bool {
   return true
}

这适用于 Swift 3/4。

【讨论】:

  • 它不适用于推送视图控制器。
【解决方案7】:

仅使用 UIAnimation 和存储属性即可顺利隐藏状态栏。

Swift 3+

  var statusBarState = false
    override var prefersStatusBarHidden: Bool{
        return statusBarState
    }

然后在viewWillAppear中

  override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        statusBarState = true
        UIView.animate(withDuration: 0.30) {
            self.setNeedsStatusBarAppearanceUpdate()
        }
    }

【讨论】:

  • 这是从 iOS 9.0+ 开始的正确处理方式
【解决方案8】:

对于那些仍在苦苦挣扎的人,以下适用于 iOS9。

您可以通过从您的各个子/孙视图控制器调用 rootViewController prefersStatusBarHidden 函数来更新它。这适用于将 childViewControllers 直接添加到 rootViewController 的情况。

您不需要在 info.plist 中设置任何内容,但设置设置“statusBarIsInitiallyHidden”独立于以下设置。

首先,在您的 rootViewController 中,添加以下内容:

-(void)viewDidLoad {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateStatusBarAppearance:) name:@"kStatusBarAppearance" object:nil]; 
}
-(void)updateStatusBarAppearance:(NSNotification *)n {
    statusBarIsHidden = [n.object boolValue];
    [self setNeedsStatusBarAppearanceUpdate];
}
-(UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleLightContent; //optional
}
-(BOOL)prefersStatusBarHidden{
    return statusBarIsHidden;
}

然后,在要隐藏状态栏的单视图控制器中,调用:

-(void)viewDidLoad {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"kStatusBarAppearance" object:[NSNumber numberWithBool:true]];
}
-(void)popSelf {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"kStatusBarAppearance" object:[NSNumber numberWithBool:false]];
}

【讨论】:

    【解决方案9】:

    当一切都失败时(就像我一样)?Swift 4.1

    无需编辑 .plist。 AppStore 会批准它

    (UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow)?.isHidden = false
    

    【讨论】:

      【解决方案10】:

      一个较晚的答案,但如果您需要替代解决方案,您可以使用:

      public func ShowStatusBar() {
      
          let statusBarWindow = UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow
          UIView.animate(withDuration: 0.3) {
              statusBarWindow?.alpha = 1
          }
      }
      
      public func HideStatusBar() {
      
          let statusBarWindow = UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow
          UIView.animate(withDuration: 0.3) {
              statusBarWindow?.alpha = 0
          }
      }
      

      【讨论】:

      • StatusBarWindow 在 iOS 13 或更高版本上不再可用
      【解决方案11】:

      你可以使用

      override public func viewWillAppear(animated: Bool) {
          super.viewWillAppear(animated)
          // hide status bar
          dispatch_async(dispatch_get_main_queue(), {
              if let window = UIApplication.sharedApplication().keyWindow {
                  window.windowLevel = UIWindowLevelStatusBar + 1
              }
          })
      
      }
      
      override public func viewWillDisappear(animated: Bool) {
          super.viewWillDisappear(animated)
          // Show status bar
          dispatch_async(dispatch_get_main_queue(), {
              if let window = UIApplication.sharedApplication().keyWindow {
                  window.windowLevel = UIWindowLevelNormal
              }
          })
      
      }
      

      【讨论】:

      • 非常感谢您的宝贵回答
      【解决方案12】:

      使用此代码:

      override func viewWillAppear(_ animated: Bool) {
          super.viewWillAppear(animated)
      
          UIApplication.shared.isStatusBarHidden = true
      }
      

      如果这段代码不起作用,你需要在info.plist中添加这个key

      查看基于控制器的状态栏外观 - 否

      【讨论】:

        【解决方案13】:

        我正在使用 Xcode 版本 9.2 / Swift 3.2 / iOS 11

        我收到了BADCloud 的这个答复表格,虽然我不确定为什么它对他不起作用。

        无论如何,它对我来说适用于特定的视图控制器。

        此答案与此处其他答案之间的区别在于,在我的 info.plist 中,当我最初 查看基于控制器的状态栏外观时 - 否,它下面的 2 个 statusBar 方法没有'不起作用,但是当我将其更改为 Yes 时,它们都可以使用。

        info.plist 更改: 查看基于控制器的状态栏外观 - 是

        在视图控制器中,您希望它在添加中更改:

        override func viewDidLoad() {
                super.viewDidLoad()
        
                // add this in ViewDidLoad
                setNeedsStatusBarAppearanceUpdate()
        }
        
        // add this underneath ViewDidLoad
        override var prefersStatusBarHidden: Bool {
          return true
        }
        

        【讨论】:

        • 您可以跳过用 viewDidLoad() 编写的代码。在 info.plist 中设置标志并覆盖 prefersStatusBarHidden 就足够了。兄弟辛苦了,谢谢你的帮助
        • 好的,感谢有关 viewDidLoad 代码的建议。我已经有一年多没有碰过那个项目了,但我会在几个月后回到它。一旦我尝试它,如果它有效,我就会把代码拿出来。谢谢你的建议。干杯!
        【解决方案14】:

        适用于 iOS 11 和 Swift 4 的完整解决方案,让您完全控制您的程序。

        var statusBarHidden : Bool?
        
        override var prefersStatusBarHidden: Bool {
            get {
                if let status = statusBarHidden { return status } else { return false }
            }
            set(status) {
                statusBarHidden = status
                setNeedsStatusBarAppearanceUpdate()
            }
        }
        

        现在您可以通过在代码中设置属性来简单地显示或隐藏状态栏。我是这样测试的:

        @IBAction func Show(_ sender: Any) {
            prefersStatusBarHidden = false
        }
        
        @IBAction func Hide(_ sender: Any) {
            prefersStatusBarHidden = true
        }
        

        像魅力一样工作。

        【讨论】:

          【解决方案15】:
          UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .None) 
          

          当你希望它回到一个单独的 VC 中时:

          UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: .None) 
          

          【讨论】:

          • 这在 iOS9 中已被弃用。格雷格的答案是正确的。
          • 是的。没有人使用此代码。已经不行了将此作为过去的参考。
          猜你喜欢
          • 2016-08-08
          • 2014-02-21
          • 2016-04-23
          • 1970-01-01
          • 2016-01-03
          • 2017-06-23
          • 1970-01-01
          • 2013-01-11
          • 1970-01-01
          相关资源
          最近更新 更多