trg*_*ofi 250 uikit ios uistatusbar ios7
我跟着这个线程来覆盖-preferredStatusBarStyle
,但它没有被调用.我可以更改任何选项以启用它吗?(我在我的项目中使用XIB.)
Tys*_*son 998
对于使用UINavigationController的任何人:
该UINavigationController
不上转发该preferredStatusBarStyle
呼叫到其子视图控制器.相反,它管理自己的状态 - 正如它应该的那样,它绘制在状态栏所在的屏幕顶部,因此应该负责它.因此preferredStatusBarStyle
,在导航控制器内的VC中实现将不会做任何事情 - 它们永远不会被调用.
诀窍在于UINavigationController
决定返回什么UIStatusBarStyleDefault
或者用途的用途UIStatusBarStyleLightContent
.它以此为基础UINavigationBar.barStyle
.默认(UIBarStyleDefault
)会生成暗前景UIStatusBarStyleDefault
状态栏.并UIBarStyleBlack
会给出一个UIStatusBarStyleLightContent
状态栏.
TL; DR:
如果你想UIStatusBarStyleLightContent
在UINavigationController
使用:
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
Run Code Online (Sandbox Code Playgroud)
Abd*_*ahC 115
我遇到了同样的问题,并且发现它正在发生,因为我没有在我的应用程序窗口中设置根视图控制器.
的UIViewController
,其中我已经实现的preferredStatusBarStyle
是在一个使用UITabBarController
,其控制的屏幕上的意见的外观.
当我将根视图控制器设置为指向此时UITabBarController
,状态栏更改开始按预期正常工作(并且该preferredStatusBarStyle
方法被调用).
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
... // other view controller loading/setup code
self.window.rootViewController = rootTabBarController;
[self.window makeKeyAndVisible];
return YES;
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以根据需要在每个视图控制器中调用以下方法之一,具体取决于其背景颜色,而不必使用setNeedsStatusBarAppearanceUpdate
:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
Run Code Online (Sandbox Code Playgroud)
要么
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
Run Code Online (Sandbox Code Playgroud)
请注意,您还需要设置UIViewControllerBasedStatusBarAppearance
到NO
如果您使用此方法在plist文件.
ser*_*enn 98
所以我实际上为UINavigationController添加了一个类别,但使用了这些方法:
-(UIViewController *)childViewControllerForStatusBarStyle;
-(UIViewController *)childViewControllerForStatusBarHidden;
Run Code Online (Sandbox Code Playgroud)
并让那些返回当前可见的UIViewController.这使得当前可见视图控制器设置其自己的首选样式/可见性.
这是一个完整的代码片段:
在Swift中:
extension UINavigationController {
public override func childViewControllerForStatusBarHidden() -> UIViewController? {
return self.topViewController
}
public override func childViewControllerForStatusBarStyle() -> UIViewController? {
return self.topViewController
}
}
Run Code Online (Sandbox Code Playgroud)
在Objective-C中:
@interface UINavigationController (StatusBarStyle)
@end
@implementation UINavigationController (StatusBarStyle)
-(UIViewController *)childViewControllerForStatusBarStyle {
return self.topViewController;
}
-(UIViewController *)childViewControllerForStatusBarHidden {
return self.topViewController;
}
@end
Run Code Online (Sandbox Code Playgroud)
为了更好的衡量,以下是它在UIViewController中的实现方式:
在斯威夫特
override public func preferredStatusBarStyle() -> UIStatusBarStyle {
return .LightContent
}
override func prefersStatusBarHidden() -> Bool {
return false
}
Run Code Online (Sandbox Code Playgroud)
在Objective-C中
-(UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent; // your own style
}
- (BOOL)prefersStatusBarHidden {
return NO; // your own visibility code
}
Run Code Online (Sandbox Code Playgroud)
最后,确保你的应用程序plist中不具有"查看基于控制器的状态栏外观"设置为NO.删除该行或将其设置为YES(我认为现在是iOS 7的默认值?)
Ale*_*own 70
对于仍在努力解决这个问题的人来说,swift中的这个简单扩展应该可以解决您的问题.
extension UINavigationController {
override open var childForStatusBarStyle: UIViewController? {
return self.topViewController
}
}
Run Code Online (Sandbox Code Playgroud)
Lui*_*uis 18
我的应用程序使用的所有三种:UINavigationController
,UISplitViewController
,UITabBarController
,因此这些似乎都采取控制在状态栏,将导致preferedStatusBarStyle
不叫他们的孩子.要覆盖此行为,您可以像其他提到的答案一样创建扩展.这是Swift 4中所有三个的扩展.希望Apple更清楚这种东西.
extension UINavigationController {
open override var childViewControllerForStatusBarStyle: UIViewController? {
return self.topViewController
}
open override var childViewControllerForStatusBarHidden: UIViewController? {
return self.topViewController
}
}
extension UITabBarController {
open override var childViewControllerForStatusBarStyle: UIViewController? {
return self.childViewControllers.first
}
open override var childViewControllerForStatusBarHidden: UIViewController? {
return self.childViewControllers.first
}
}
extension UISplitViewController {
open override var childViewControllerForStatusBarStyle: UIViewController? {
return self.childViewControllers.first
}
open override var childViewControllerForStatusBarHidden: UIViewController? {
return self.childViewControllers.first
}
}
Run Code Online (Sandbox Code Playgroud)
Yog*_*har 15
泰森的答案是正确的,将状态栏颜色更改为白色UINavigationController
.
如果有人希望通过编写代码来完成相同的结果,AppDelegate
那么使用下面的代码并将其写入AppDelegate's
didFinishLaunchingWithOptions
方法内.
并且不要忘记在.plist文件中设置UIViewControllerBasedStatusBarAppearance
to YES
,否则更改不会反映出来.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// status bar appearance code
[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];
return YES;
}
Run Code Online (Sandbox Code Playgroud)
Art*_*mov 10
Hippo答案的补充:如果您使用的是UINavigationController,那么最好添加一个类别:
// UINavigationController+StatusBarStyle.h:
@interface UINavigationController (StatusBarStyle)
@end
// UINavigationController+StatusBarStyle.m:
@implementation UINavigationController (StatusBarStyle)
- (UIStatusBarStyle)preferredStatusBarStyle
{
//also you may add any fancy condition-based code here
return UIStatusBarStyleLightContent;
}
@end
Run Code Online (Sandbox Code Playgroud)
该解决方案可能比转换为即将弃用的行为更好.
在UINavigationController上,preferredStatusBarStyle
未调用,因为它topViewController
是首选self
.因此,要preferredStatusBarStyle
在UINavigationController上调用,您需要更改它childViewControllerForStatusBarStyle
.
要为一个UINavigationController(我的推荐)做到这一点:
class MyRootNavigationController: UINavigationController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
override var childViewControllerForStatusBarStyle: UIViewController? {
return nil
}
}
Run Code Online (Sandbox Code Playgroud)
要为所有UINavigationController执行此操作(警告:它会影响UIDocumentPickerViewController,UIImagePickerController等):
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
open override var childViewControllerForStatusBarStyle: UIViewController? {
return nil
}
}
Run Code Online (Sandbox Code Playgroud)
除了serenn的答案之外,如果要为视图控制器提供一个modalPresentationStyle
(例如.overCurrentContext
),还应该在新显示的视图控制器上调用它:
presentedViewController.modalPresentationCapturesStatusBarAppearance = true
Run Code Online (Sandbox Code Playgroud)
别忘了还要覆盖preferredStatusBarStyle
显示的视图控制器中的。
UINavigationController
是UIViewController
(谁知道)的子类!
因此,当呈现嵌入在导航控制器中的视图控制器时,您并没有真正呈现嵌入的视图控制器;您正在展示导航控制器!UINavigationController
,作为 的子类UIViewController
,继承preferredStatusBarStyle
和childForStatusBarStyle
,您可以根据需要进行设置。
以下任何一种方法都应该有效:
info.plist
,添加以下属性:
UIUserInterfaceStyle
(又名“用户界面风格”)覆盖preferredStatusBarStyle
范围内UINavigationController
preferredStatusBarStyle
( doc ) - 视图控制器的首选状态栏样式子类或扩展 UINavigationController
class MyNavigationController: UINavigationController {
override var preferredStatusBarStyle: UIStatusBarStyle {
.lightContent
}
}
Run Code Online (Sandbox Code Playgroud)
或者
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
.lightContent
}
}
Run Code Online (Sandbox Code Playgroud)覆盖childForStatusBarStyle
范围内UINavigationController
childForStatusBarStyle
( doc ) - 当系统需要视图控制器用于确定状态栏样式时调用“如果您的容器视图控制器从其子视图控制器之一派生其状态栏样式,[覆盖此属性] 并返回该子视图控制器。如果您返回 nil 或不覆盖此方法,则使用 self 的状态栏样式. 如果此方法的返回值发生更改,请调用 setNeedsStatusBarAppearanceUpdate() 方法。”
子类或扩展 UINavigationController
class MyNavigationController: UINavigationController {
override var childForStatusBarStyle: UIViewController? {
topViewController
}
}
Run Code Online (Sandbox Code Playgroud)
或者
extension UINavigationController {
open override var childForStatusBarStyle: UIViewController? {
topViewController
}
}
Run Code Online (Sandbox Code Playgroud)你可以返回任何你喜欢的视图控制器。我推荐以下之一:
注意:如果您决定子类化UINavigationController
,请记住通过 IB 中的身份检查器将该类应用到您的导航控制器。
PS 我的代码使用 Swift 5.1 语法
对于UINavigationControllers来说,@ serenn的答案仍然是一个很好的答案.但是,对于swift 3,childViewController函数已更改为vars
.所以UINavigationController
扩展代码应该是:
override open var childViewControllerForStatusBarStyle: UIViewController? {
return topViewController
}
override open var childViewControllerForStatusBarHidden: UIViewController? {
return topViewController
}
Run Code Online (Sandbox Code Playgroud)
然后在视图控制器中应该指定状态栏样式:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Run Code Online (Sandbox Code Playgroud)
如所选答案中所述,根本原因是检查窗口的根视图控制器对象。
childForStatusBarStyle
使用以下扩展名,它可以处理所有上述情况 -
extension UITabBarController {
open override var childForStatusBarStyle: UIViewController? {
return selectedViewController?.childForStatusBarStyle ?? selectedViewController
}
}
extension UINavigationController {
open override var childForStatusBarStyle: UIViewController? {
return topViewController?.childForStatusBarStyle ?? topViewController
}
}
extension AppRootViewController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
return children.first { $0.childForStatusBarStyle != nil }?.childForStatusBarStyle?.preferredStatusBarStyle ?? .default
}
}
Run Code Online (Sandbox Code Playgroud)
UIViewControllerBasedStatusBarAppearance
键入info.plist
如果您以模态方式呈现新流程,则它将与现有状态栏样式流程分离。因此,假设您要展示一个NewFlowUIViewController
,然后向添加新的导航或tabBar控制器NewFlowUIViewController
,然后再添加的扩展名,NewFlowUIViewController
以管理其他视图控制器的状态栏样式。
如果您设置了modalPresentationStyle而不是fullScreen
模态呈现时,则必须将其设置modalPresentationCapturesStatusBarAppearance
为true,以便呈现的视图控制器必须接收状态栏外观控件。
如果你的viewController在UINavigationController下.
子类UINavigationController并添加
override var preferredStatusBarStyle: UIStatusBarStyle {
return topViewController?.preferredStatusBarStyle ?? .default
}
Run Code Online (Sandbox Code Playgroud)
preferredStatusBarStyle
将调用ViewController .
归档时间: |
|
查看次数: |
115414 次 |
最近记录: |