如何在Swift中设置状态栏风格3
我正在使用Xcode 8.0 beta 4。
在以前的版本中,UIViewController有设置状态栏风格的方法
public func preferredStatusBarStyle() -> UIStatusBarStyle
但是,我发现它在Swift 3中变成了“只可变varaiable”。
public var preferredStatusBarStyle: UIStatusBarStyle { get }
如何提供在我的UIViewController中使用的样式?
您可以尝试覆盖返回的值,而不是设置它。 该方法被声明为{get},所以只需要提供一个getter:
override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
如果您有条件地设置,则需要调用setNeedsStatusBarAppearanceUpdate()
以便在准备就绪时生成更改
ios 10和swift 3
-
在info.plist中更改该行查看基于控制器的状态栏外观 ,并将其设置为NO
-
更改didFinishLaunchingWithOptions中的appDelegate.swift
UIApplication.shared.statusBarStyle = .lightContent
Swift 3,iOS 10
对我而言,这种方法不起作用:
override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
当我使用每个视图控制器,但这工作:
-
在文件info.list中,添加行:
View controller-based status bar appearance
并设置为NO
-
接下来在appdelegate:
UIApplication.shared.statusBarStyle = .lightContent
您需要在Info.plist文件中添加以下键:
View controller-based status bar appearance
,布尔值设置为NO
在你的appdelegate类中,在didFinishLaunchingWithOptions
方法返回之前。
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView if statusBar.responds(to:#selector(setter: UIView.backgroundColor)) { statusBar.backgroundColor = UIColor.red } UIApplication.shared.statusBarStyle = .lightContent
根据需要更改backgroundColor
和statusBarStyle
。
如果你想在视图出现后的任何时候改变状态栏的样式,你可以使用这个:
-
在文件info.list中添加行: 查看基于控制器的状态栏外观 ,并将其设置为YES
var viewIsDark = Bool() func makeViewDark() { viewIsDark = true setNeedsStatusBarAppearanceUpdate() } func makeViewLight() { viewIsDark = false setNeedsStatusBarAppearanceUpdate() } override var preferredStatusBarStyle: UIStatusBarStyle { if viewIsDark { return .lightContent } else { return .default } }
第一步,需要添加一行键: View controller-based status bar appearance
和值为Info.plist
文件的NO
。 之后,在你的控制器中添加2个函数,只有控制器才会生效:
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) UIApplication.shared.statusBarStyle = .lightContent } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) UIApplication.shared.statusBarStyle = .default }
如果你想将statusBar
的颜色更改为白色,那么对于包含在UINavigationController
所有视图,请在AppDelegate
添加:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. UINavigationBar.appearance().barStyle = .blackOpaque return true }
此代码:
override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
对于包含在UINavigationController
UIViewControllers
不起作用,因为编译器查找UINavigationController
的statusBarStyle
,而不是查找它包含的ViewControllers
的statusBarStyle
。
希望这有助于那些没有被接受的答案的成功!
Xcode 8.3.1,Swift 3.1
-
在info.plist中创build一个新条目“基于视图控制器的状态栏外观”将其设置为“NO”。
-
打开AppDelegate.swift并在“didFinishLaunchingWithOptions”方法中添加这些行:
application.statusBarStyle = .lightContent
你也可以在故事板中做到这一点
- 在info.plist中创build一个新条目“基于视图控制器的状态栏外观”将其设置为“YES”。
- 转到故事板,然后select要更改的导航控制器。 单击故事板文档大纲部分的导航栏(故事板上的左侧面板)
- 转到右侧面板,然后单击属性部分
- 在导航栏部分,您将看到样式。 select您想要的样式(默认为黑色,黑色为白色)
您必须为每个导航控制器执行此操作。 但是,该导航控制器下的任何视图都会将所有视图的状态栏样式/颜色更改为您刚select的状态栏。 我发现这个选项更好,因为你可以立即看到你的结果,而不必在每个视图控制器中添加额外的代码行。
(在所有Swift项目中使用Xcode 8.3.3完成)
这对我有效
在plist中将View controller-based status bar
外观设置为NO ,然后在UIViewController
viewDidAppear
只是添加了以下行
UIApplication.shared.setStatusBarStyle(UIStatusBarStyle.lightContent, animated: true)
Swift 3,Xcode 8.3.3
首先,进入Info.plist并添加一个名为“基于视图控制器的状态栏外观”的行,并将其(仅布尔值)设置为“NO”。
class YourViewController: UIViewController { // view did load override func viewDidLoad() { super.viewDidLoad() // custom status bar UIApplication.shared.statusBarStyle = .lightContent //or .default setNeedsStatusBarAppearanceUpdate() } }
我得到:
重写var必须与其封闭types一样可访问
这是通过添加public
来解决的:
override public var preferredStatusBarStyle: UIStatusBarStyle { get { return .lightContent } }
在Swift3 iOS10上。
迅速3
如果在Info.plist中,基于视图控制器的状态栏外观= YES
然后对所有的NavigationController使用这个扩展
extension UINavigationController { override open var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } }
如果没有UINavigationController并且只有UIViewController,则使用下面的代码:
extension UIViewController { override open var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } }
对于目标C,只需在应用程序didFinishLaunch方法中添加此行即可
UIApplication.sharedApplication.statusBarStyle = UIStatusBarStyleLightContent;
Swift 3
要在应用程序中设置相同的导航栏外观,可以在AppDelegate.swift中执行此操作:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { setupNavigationBarAppearence() return true } private func setupNavigationBarAppearence(){ let navigationBarAppearace = UINavigationBar.appearance() navigationBarAppearace.isTranslucent = false //nav bar color navigationBarAppearace.barTintColor = UIColor.primaryColor() //SETS navbar title string to white navigationBarAppearace.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white] //Makes the batery icon an any other icon of the device to white. navigationBarAppearace.barStyle = .black }
Swift 4.0请使用此代码在“didFinishLaunchingWithOptions launchOptions:”Appdelegate类
UIApplication.shared.statusBarStyle = .lightContent let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView if statusBar.responds(to: #selector(setter: UIView.backgroundColor)){ statusBar.backgroundColor = UIColor.black }