在 XCode 8.2 / Swift 3.0 中更改状态栏样式(没有“查看基于控制器的状态栏外观”)
Posted
技术标签:
【中文标题】在 XCode 8.2 / Swift 3.0 中更改状态栏样式(没有“查看基于控制器的状态栏外观”)【英文标题】:Change Status Bar style in XCode 8.2 / Swift 3.0 (No "View controller-based status bar appearance") 【发布时间】:2017-06-09 00:25:55 【问题描述】:我正在尝试修改状态栏的外观(将文本设为白色/将样式设置为“浅色”)。我设法通过将其添加到我的 AppDelegate.swift 文件来设置背景颜色:
let statWindow = UIApplication.shared.value(forKey:"statusBarWindow") as! UIView
let statusBar = statWindow.subviews[0] as UIView
statusBar.backgroundColor = UIColor(red: 0/255.0, green: 0/255.0, blue: 0/255.0, alpha: 1.0)
但是,当我去更改状态栏文本的样式时,即使在“常规”>“部署信息”>“状态栏样式”下更改(将其更改为“轻”)也不起作用。
我也尝试通过 Info.plist 修改状态栏,但是没有“查看基于控制器的状态栏外观”字段(见第二张图)。此外,状态栏样式选项下没有“轻”样式选项(见下图):
状态栏样式选项:
没有视图控制器状态栏字段:
【问题讨论】:
【参考方案1】:您错过的步骤是 Info.plist。
打开应用的info.plist文件,将UIViewControllerBasedStatusBarAppearance设置为NO(如下图)。
注意:如果此密钥尚不存在,则可以通过以下方式添加:
1) 将鼠标悬停在现有条目上以显示添加/删除图标:
2) 点击加号图标添加新的键/值对:
3) 将UIViewControllerBasedStatusBarAppearance
粘贴到关键字段并将其值设置为NO
。请注意,取消选择时,密钥将更改为View controller-based status...
,但它是同一件事:
【讨论】:
你错过了我帖子中的一些细节 - 我的 info.plist 中不存在该字段 :( 我添加了第二张图片来向你展示我的 info.plist 文件的样子 我相信@enghong 建议您将该键添加到 Info.plist。您可以将鼠标悬停在应该显示加号/减号图标对的现有条目上,单击加号图标,粘贴建议的键,然后将值设置为 NO(这是我的默认值)。然后,您应该在整个应用程序中都有白色状态栏文本,而无需手动设置每个 UIViewController 子类。至少这对我有用。 这是正确的答案,正是我想要的。设置 BOTH 键后,全局状态栏内容设置为亮,无需代码。【参考方案2】:在应用程序的每个 UIViewController 中,您应该覆盖 preferredStatusBarStyle
属性:
override var preferredStatusBarStyle: UIStatusBarStyle return .lightContent
最后,调用:
<your controller>.setNeedsStatusBarAppearanceUpdate()
如果此 statusBar 样式贯穿于您的所有应用程序,您应该创建一个实现该样式的 BaseViewController
类,并使您的所有视图控制器都继承自 BaseViewController。
【讨论】:
除此答案外,另请参阅此处:***.com/questions/41026514/…【参考方案3】:斯威夫特 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
创建类别类
对于 UIViewController
在 UIViewController+StatusBarStyle.h
@interface UIViewController (StatusBarStyle)
@end
在 UIViewController+StatusBarStyle.m 中
#import "UIViewController+StatusBarStyle.h"
@implementation UIViewController (StatusBarStyle)
-(UIStatusBarStyle)preferredStatusBarStyle
return UIStatusBarStyleLightContent;
@end
对于 UINavigationController
在 UINavigationController+StatusBarStyle.h
@interface UINavigationController (StatusBarStyle)
@end
在 UINavigationController+StatusBarStyle.m
#import "UINavigationController+StatusBarStyle.h"
@implementation UINavigationController (StatusBarStyle)
-(UIStatusBarStyle)preferredStatusBarStyle
return UIStatusBarStyleLightContent;
@end
【讨论】:
【参考方案4】:对于 Xcode 10,您可以简单地为 UIViewController 或 UITableViewController ecc 创建一个类。并将其放在您的 UIViewController 类之前,您可以在所有需要轻量内容状态栏的视图控制器中调用此类...
class UIViewControllerWithLightStatusBar: UIViewController
override var preferredStatusBarStyle: UIStatusBarStyle
return UIStatusBarStyle.lightContent
在 AppDelegate 中设置状态栏:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
// Override point for customization after application launch.
UINavigationBar.appearance().isTranslucent = false
UINavigationBar.appearance().clipsToBounds = false
UINavigationBar.appearance().barStyle = .blackOpaque
return true
现在你用 UIViewControllerWithLightStatusBar 改变类 UIViewController
class YourViewController: UIViewControllerWithLightStatusBar
...
就是这样……
【讨论】:
以上是关于在 XCode 8.2 / Swift 3.0 中更改状态栏样式(没有“查看基于控制器的状态栏外观”)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SWIFT3 XCODE 8.2 的 IOS 应用程序中显示 Snackbar 的操作中的特定视图
Xcode 8.2,Swift 编译器错误:错误:意外的输入文件