我正在使用Xcode 8.0 beta 4 .
在以前的版本中,UIViewController具有设置状态栏样式的方法
public func preferredStatusBarStyle() -> UIStatusBarStyle
但是,我发现它在Swift 3中改为“Get ONLY varaiable” .
public var preferredStatusBarStyle: UIStatusBarStyle { get }
如何在我的UIViewController中提供使用的样式?
28 回答
这些答案中的大多数都是重新散列的,但在使用深色背景时,它们都没有真正解决我的启动画面问题 .
我在
info.plist
中使用以下内容解决了这个问题,它产生了一个轻薄的状态栏 .This is the preferred method for iOS 7 and higher
在应用程序的
Info.plist
中,将"View controller-based status bar appearance"设置为YES .Override preferredStatusBarStyle in each of your view controllers . 例如:
如果
preferredStatusBarStyle
根据视图控制器内部更改的内容返回不同的首选状态栏样式(例如,滚动位置或显示的图像是否较暗),那么当该状态发生变化时,您将需要调用setNeedsStatusBarAppearanceUpdate()
.如果使用导航控制器并且希望使用每个视图控制器的首选状态栏样式,请参阅https://stackoverflow.com/a/41026726/1589422 .
iOS before version 7, deprecated method
Apple has deprecated this,因此将来会被删除 . 使用上面的方法,以便在下一个iOS版本发布时不必重写它 .
如果您的应用程序支持在您的应用程序的
Info.plist
中,请将"View controller-based status bar appearance"设置为NO .在
appDelegate.swift
,didFinishLaunchingWithOptions
函数中,添加:Xcode 8.3.1,Swift 3.1
在info.plist中创建一个新条目“查看基于控制器的状态栏外观”将其设置为“NO” .
打开AppDelegate.swift并在“didFinishLaunchingWithOptions”方法中添加以下行:
application.statusBarStyle = .lightContent
Swift 4.0请在“didFinishLaunchingWithOptions launchOptions:”Appdelegate类中使用此代码
这对我有用
将
View controller-based status bar
外观设置为plist中的 NO 然后在UIViewController
viewDidAppear
中添加以下行您可以使用名为“shouldStatusBarDark”的bool属性来切换状态栏颜色 . 您还可以更新其值以在滚动时更改状态栏颜色 .
我得到了:
通过添加
public
修复了这个问题:在Swift3 iOS10上 .
第一步,您需要添加一行键:
View controller-based status bar appearance
和值NO
到Info.plist
文件 . 之后,在控制器中添加2个功能,只有控制器才能生效:Swift 4+
对于白色状态栏文本:
swift 3
如果在Info.plist中查看基于控制器的状态栏外观= YES
然后对所有NavigationController使用此扩展
如果没有UINavigationController并且只有UIViewController,那么使用下面的代码:
处理导航栏时,状态栏文本颜色似乎有一个小问题 .
如果要将.plist条目View基于控制器的状态栏外观设置为
YES
,则当您有彩色导航栏时,它有时不起作用 .例如:
和
override var preferredStatusBarStyle: UIStatusBarStyle {return .lightContent}
即使您在AppDelegate中设置了以下代码,上述代码也不起作用:
UIApplication.shared.statusBarStyle = .lightContent
对于那些仍在苦苦挣扎的人来说,显然它会以某种方式判断导航栏中的状态栏是否需要亮或暗 . 所以,我设法通过在viewWillAppear中添加以下行来解决这个问题:
nav?.barStyle = UIBarStyle.black
当条形样式为黑色时,它会侦听被覆盖的变量 . 希望这有助于某人:)
这对我有用:)我的导航控制器嵌入在我的视图控制器中,隐藏了导航栏 . 我想在应用程序的某些视图上设置状态栏指示灯 .
使用WebkitView
Swift 9.3 iOS 11.3
对于希望在所有视图控制器上更改状态栏的人:iOS 11,Swfit 4解决方案非常简单 .
1) Info.plist add:
2) XCode slect项目的左侧> Targets >选择项目>常规>部署信息>选择状态栏样式:光
如果您只想为 one viewcontroller 更改状态栏,请在viewDidLoad上添加:
iOS 11.2
Swift 3
要在应用程序中设置相同的导航栏外观,可以在AppDelegate.swift中执行此操作:
您可以尝试覆盖返回的值,而不是设置它 . 该方法声明为,因此只需提供一个getter:
如果您有条件地设置此项,则需要调用
setNeedsStatusBarAppearanceUpdate()
以使'll animate the change when you'准备就绪Swift 3 & 4, iOS 10 & 11, Xcode 9 & 10
对我来说,这种方法不起作用:
当我习惯每个视图控制器,但这工作:
在文件info.list中,添加行:
View controller-based status bar appearance
并设置为NO
appdelegate中的下一个:
Swift 3
在Info.plist中添加一行名为"View controller-based status bar appearance"的行,并将其值设置为
No
.你也可以这样做这在故事板中
在info.plist中创建一个新条目"View controller-based status bar appearance"将其设置为"YES" .
转到故事板,然后选择要更改的导航控制器 . 单击Storyboard文档大纲部分的导航栏(故事板上的左侧面板)
转到右侧面板,然后单击属性部分
在导航栏部分下,您将看到样式 . 选择您想要的样式(默认为黑色,黑色为白色)
您必须为每个导航控制器执行此操作 . 但是,该导航控制器下的任何视图都会将所有视图的状态栏样式/颜色更改为您刚刚选择的那个 . 我发现这个选项更好,因为你可以立即看到你的结果,而不必在每个视图控制器中添加额外的代码行 .
(在所有Swift项目中使用Xcode 8.3.3完成)
如果要将
statusBar
的颜色更改为白色,对于UINavigationController
中包含的所有视图,请在AppDelegate
中添加:这段代码:
does not 工作
UIViewControllers
包含UINavigationController
,因为编译器查找UINavigationController
的statusBarStyle
,而不是查找ViewControllers
的statusBarStyle
.希望这能帮助那些没有成功接受答案的人!
要添加到@Krunal https://stackoverflow.com/a/49552326/4697535的伟大asnwer
如果您使用
UINavigationController
,preferredStatusBarStyle
将对UIViewController
无效 .Xcode 10 and Swift 4.
设置自定义
UINavigationController
Example:
使用应用级解决方案的扩展程序:
最新更新(Xcode 10 / Swift 4.2)
对于愿意理解过去几年中存在的不同方法背后的逻辑的人来说,本文保持不变 . 同时,从 Xcode 10, Swift 4.2 first approach is deprecated起不再支持(即 will not 如果您尝试使用它则生效) . 它仍然提供给您的信息,以便更好地理解
Plist.info
标志和定制实践背后的原因 .重要说明
了解自定义状态栏外观的两种方法非常重要 . 它们是不同的,不应该混合 .
第一种方法 - 整个应用程序的一种颜色(自iOS7以来已弃用)
在info.plist中,您可以找到或创建一个名为的密钥
View controller-based status bar appearance
并将其设置为 NO .
它能做什么?它基本上 Build 了一个设置,在您的应用程序中,状态栏外观 is not defined individually by each view controller . 理解这一点非常重要 . 这意味着您可以为整个应用程序设置统一设置,用于 all 屏幕 . 有两种设置:
default
,在白色背景上为黑色文本,或lightContent
,在黑色背景上为白色文本 .要设置其中一个( one setting for all screens ):
这样,您无需在每个视图控制器上重新 Build 此设置 . 但是,您始终可以使用此方法自动更改外观 .
第二种方法 - 每个视图控制器的单独颜色
这是相反的 . 要使其工作,请继续info.plist并设置
View controller-based status bar appearance
到 YES
这样,每当打开一个新的视图控制器时,如果在所需的每个
UIViewController
实例中插入此实现,则会单独设置状态栏样式:您与第一个相同,为状态栏设置暗或亮样式,为每个视图控制器设置个别 .
第三种方法 - 哈克!
有一个hack允许直接访问状态栏:
为什么破解?如果您需要状态栏颜色而不是黑色或白色,则使用未记录的API . 使用KVC获取
statusBar
对象并设置其背景颜色 . 你通过这种方式获得的对象是UIStatusBar
,它是从UIView
派生的,因此自然支持backgroundColor
属性 . 这是脏的,不合法的方式,但到目前为止,它是为状态栏设置自定义颜色的唯一方法(不考虑UINavigationBar
方法,它允许完全自定义导航栏状态栏外观) . 它可能会导致您的应用被拒绝 . 但也许你很幸运 . 如果你是,在某些复杂情况下(如嵌套,子导航和视图控制器的层次结构),这可能是自定义状态栏外观的唯一或至少不那么麻烦的方式(例如,使其透明)Xcode 10+, Swift 4.2
没有其他选择:开发人员应该让 each 视图控制器定义状态栏外观,方法是将标志设置为 YES (或省略此操作,因为默认情况下为YES)并遵循上述说明 .
Bonus
您可能(虽然不鼓励)在复杂环境中使用基于Hack的解决方案,以便在任何阶段自动更改状态栏外观 . 颜色方面,以下扩展方法完全按照常规方法完成 . 您可以根据自己的需要进行调整 .
请将以下行添加到info.plist中,然后才能实现
“查看基于控制器的状态栏外观=否“
并将以下代码段添加到您的代码中并查看输出
这是关于状态栏样式更改的Apple Guidelines/Instruction .
如果要设置状态栏样式,应用程序级别,请在
.plist
文件中将UIViewControllerBasedStatusBarAppearance
设置为NO
. 并在您的appdelegate
>didFinishLaunchingWithOptions
添加以下ine(以编程方式,您可以从app delegate执行此操作) .Objective C
Swift
如果您要设置状态栏样式,请在视图控制器级别,然后按照下列步骤操作:
如果需要仅在UIViewController级别设置状态栏样式,请将
UIViewControllerBasedStatusBarAppearance
设置为.plist
文件中的YES
.在viewDidLoad中添加功能 -
setNeedsStatusBarAppearanceUpdate
覆盖视图控制器中的preferredStatusBarStyle .
Objective C
Swift
根据状态栏样式设置级别设置.plist的值 .
您需要在Info.plist文件中添加以下密钥:
View controller-based status bar appearance ,布尔值设置为 NO
在你的appdelegate类中,在
didFinishLaunchingWithOptions
方法返回之前 .根据要求更改
backgroundColor
和statusBarStyle
.如果要在视图出现后随时更改状态栏样式,可以使用以下命令:
对于目标C,只需在您的应用程序didFinishLaunch方法中添加此行