override func preferredStatusBarStyle() -> UIStatusBarStyle {
 return UIStatusBarStyle.LightContent;
}

使用上述代码在任何ViewController中为特定的ViewController设置状态栏颜色为白色,在iOS8中对我来说是行不通的。有什么建议吗?使用UIApplication。shared应用方法,在信息中需要更改后颜色更改。Plist为整个应用程序。

// Change the colour of status bar from black to white
UIApplication.sharedApplication().statusBarStyle = .LightContent

我怎么能改变一些必要的和特定的视图控制器的状态栏颜色?


当前回答

我已经设置了特定的颜色(在RGB格式)使用下面的代码在应用程序委托文件:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
. . .

 UIApplication.sharedApplication().statusBarHidden = false
        UIApplication.sharedApplication().statusBarStyle = .LightContent

        let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
        if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
            statusBar.backgroundColor = UIColor.init(red: 0.1, green: 0.27, blue: 0.60, alpha: 1.0)
        }

. . .
}

您还需要添加以下关键信息。Plist文件:

查看基于控制器的状态栏外观,布尔值设置为NO

其他回答

Swift 3.0升级

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        UIApplication.shared.statusBarStyle = .lightContent

        return true
    }

有两种情况:

1.显示导航栏

1)添加1uiviewcontrollerbasedstatusbarappearance /基于视图控制器的状态栏外观到你的信息。Plist, set value为true。

2)在你的自定义NavigationController类中覆盖preferredStatusBarStyle属性:

class NavigationController : UINavigationController {

    override var preferredStatusBarStyle : UIStatusBarStyle {

    if let topVC = viewControllers.last {
        //return the status property of each VC, look at step 2
        return topVC.preferredStatusBarStyle  
    }
        return .default
    }

3)覆盖preferredStatusBarStyle在你的特定视图控制器:

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

2.隐藏导航栏

1)同上

2)不需要以上第二步,直接执行第三步。

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

斯威夫特4.2 嘿,我想分享一个解决方案,我从格雷格·格鲁米特的一篇关于这个神秘主题的好文章中得到的。

步骤1 正如其他人所提到的,添加到你的PLIST

View controller-based status bar appearance YES

步骤2在RootViewcontroller中添加如下

var statusBarHidden: Bool = false {
        didSet(newValue) {
            UIView.animate(withDuration: 0.1) {
                self.setNeedsStatusBarAppearanceUpdate()
            }
        }
    }

    override var prefersStatusBarHidden: Bool {
        return statusBarHidden
    }

    var vcStatusBarStyle: UIStatusBarStyle = .default {
        didSet(newValue) {
            UIView.animate(withDuration: 0.1) {
                self.setNeedsStatusBarAppearanceUpdate()
            }
        }
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return vcStatusbarStyle
    }

当更新属性statusBarHidden或vcStatusBarStyle时,它将调用setNeedsStatusBarAppearanceUpdate(),并将更新状态栏与prefersStatusBarHidden或preferredStatusBarStyle的新值。在我的情况下,我必须为容器视图控制器更新这些属性,这是可见的子视图控制器的父。我使用一个简单的委托方法做到了这一点。

protocol MainViewControllerDelegate {
    func updateStatusBarStyle(statBarStayle: UIStatusBarStyle)
    func toggleStatusBar(visable: Bool)
}

当然,当实例化childViewController(Visible VC)时,不要忘记将MainViewcontroller(Container VC)设置为它的委托。我有时会。:)

childViewController.delegate = self

然后在childViewController中,当需要更新状态栏时,我只调用委托方法。

self.delegate?.updateStatusBarStyle(statBarStayle: .default)

如上所述,Graig Grummitt详细介绍了这个解决方案,也与UINavigationControllers一起工作。链接这里:状态栏的神秘案例

实现preferredStatusBarStyle,如你所述,并调用self.setNeedsStatusBarAppearanceUpdate()在ViewDidLoad和 也在信息。设置UIViewControllerBasedStatusBarAppearance为YES(默认是YES)

目前还不清楚为什么它不起作用。我需要检查代码。另一个建议是 使用viewDidLoad UIApplication.sharedApplication()中的工作代码。statusBarStyle = . lightcontent,并将此更改为默认值,当您查看viewgetdisappear viewWillDisappear。

警告


'statusBarStyle'的Setter在iOS 9.0中已弃用:

UIApplication.shared.statusBarStyle = .default

所以我的解决方案是这样的: 从导航控制器做一个扩展:

extension UINavigationController {
    open override var preferredStatusBarStyle: UIStatusBarStyle {
        if let topViewController = presentedViewController{
            return topViewController.preferredStatusBarStyle
        }
        if let topViewController = viewControllers.last {
            return topViewController.preferredStatusBarStyle
        }

        return .default
    }
}

如果你有一个viewController它会有另一个样式而不是app的样式,你可以做这个

var barStyle = UIStatusBarStyle.lightContent
override var preferredStatusBarStyle: UIStatusBarStyle{
    return barStyle
}

假设你的app状态样式是。default,你希望这个屏幕是。lightcontent 所以barStyle会把。lightContent作为它的默认值,这将改变状态栏的样式为lightContent,然后确保当viewWillDisappear再次改变barStyle为应用程序状态栏的样式,在我们的例子中是。default。

这对我很有用