如何在iOS 9中隐藏单个视图控制器的状态栏?

时间:2016-01-27 03:22:27

标签: ios swift

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

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

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

14 个答案:

答案 0 :(得分:62)

Swift 3 & Swift 4 它已改为覆盖这样的变量:

override var prefersStatusBarHidden: Bool {
  return true
}

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

setNeedsStatusBarAppearanceUpdate()

请参阅documentation

答案 1 :(得分:41)

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

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

    UIApplication.shared.isStatusBarHidden = true
}

查看去往Dissapear的goint

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

    UIApplication.shared.isStatusBarHidden = false
}

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

View controller-based status bar appearance = NO

enter image description here

答案 2 :(得分:19)

在iOS 9,Xcode 7,Swift 2.0中,它回到了之前的状态。

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

实际上Xcode会告诉你

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

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

答案 3 :(得分:19)

In your 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
}

答案 4 :(得分:10)

对于Swift 3,

override var prefersStatusBarHidden: Bool{
        return true
    }

并添加viewDidLoad()

self.modalPresentationCapturesStatusBarAppearance = true

答案 5 :(得分:4)

您只需在ViewController中覆盖 prefersStatusBarHidden属性即可实现此目的,如下所示:

override var prefersStatusBarHidden: Bool {
   return true
}

Screenshot added

适用于Swift 3/4。

答案 6 :(得分:2)

对于那些仍在努力的人,以下适用于iOS9。

通过从您的各个子/孙视图控制器中调用rootViewController来更新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]];
}

答案 7 :(得分:2)

当其他所有方法都失败时(就像它对我而言)Swift 4.1

不需要编辑.plist。 AppStore会批准它

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

答案 8 :(得分:2)

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

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
    }
}

答案 9 :(得分:1)

您可以使用

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
        }
    })

}

答案 10 :(得分:0)

适用于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
}

像魅力一样。

答案 11 :(得分:0)

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

我得到了BADCloud这个答案,虽然我不确定为什么它对他不起作用。

无论如何,它对我来说是一个特定的视图控制器。

这个答案和其他答案之间的区别在于我info.plist当我最初使用查看基于控制器的状态栏外观 - 否时,它下面有2个statusBar方法没有用,但当我把它更改为时,它们都适用于它们。

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

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

override func viewDidLoad() {
        super.viewDidLoad()

        // add this in ViewDidLoad
        setNeedsStatusBarAppearanceUpdate()
}

// add this underneath ViewDidLoad
override var prefersStatusBarHidden: Bool {
  return true
}

答案 12 :(得分:0)

只需使用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()
        }
    }

enter image description here

答案 13 :(得分:-1)

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

当你想要它回到一个单独的VC中时:

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