基于不同的ViewController在iOS 7中设置灯光状态栏文字颜色的正确方法
我需要让一个特定的ViewControllerembedded在UINavigationController
使其状态栏的文字颜色为淡(但其他ViewController
的行为不同)。 我知道至less有3种方法,但其中没有一种适用于我的情况。
-
如何在iOS 7中更改状态栏的文字颜色 ,方法主要是:
- 在plist中将
UIViewControllerBasedStatusBarAppearance
设置为YES
- 在viewDidLoad中做一个
[self setNeedsStatusBarAppearanceUpdate];
-
添加以下方法:
- (UIStatusBarStyle)preferredStatusBarStyle{ return UIStatusBarStyleLightContent; }
运行在iOS 7.0.3上,这个方法对我来说不起作用,因为即使我正确实现了所有3个步骤,
preferredStatusBarStyle
也不会被调用。 - 在plist中将
-
UIStatusBarStyle PreferredStatusBarStyle不适用于iOS 7 ,该方法主要是:
将你的
navigationBar
的barStyle
设置为UIBarStyleBlackTranslucent
会给出白色的状态栏文本(即UIStatusBarStyleLightContent
),而UIBarStyleDefault
会给出黑色的状态栏文本(即UIStatusBarStyleDefault
)。这个方法在iPhone上公平地工作,而不是在iPad上。
-
在plist中将
UIViewControllerBasedStatusBarAppearance
设置为NO
,然后使用[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
这显然不适用于这种情况,因为我只需要为两个
ViewController
指定不同的状态栏颜色。
感谢所有的帮助!
对于有UINavigationController
这个问题的人,我可以推荐创build一个自定义的UINavigationController
并像这样实现preferredStatusBarStyle
:
- (UIStatusBarStyle)preferredStatusBarStyle { return [self.topViewController preferredStatusBarStyle]; }
那样的状态栏风格将是顶视图控制器的风格。 现在你可以无论如何实现视图控制器的preferredStatusBarStyle
。
要为UINavigationController
堆栈上的每个UIViewController
单独设置UIStatusBarStyle
,必须首先创build子类UINavigationController
并覆盖childViewControllerForStatusBarStyle
方法。
在你的UINavigationController子类中添加:
-(UIViewController *)childViewControllerForStatusBarStyle { return self.visibleViewController; }
比你可以设置UIStatusBarStyle
任何你想在每个UIViewController
使用preferredStatusBarStyle
方法。 例如:
-(UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; }
下面是对Groot答案的一个改进,以UINavigationController的简单类别的forms,而不需要inheritanceUINavigationController。
迅速
extension UINavigationController { override public func preferredStatusBarStyle() -> UIStatusBarStyle { return self.topViewController?.preferredStatusBarStyle() ?? .Default } }
Objective-C的
@implementation UINavigationController (StatusBarStyle) - (UIStatusBarStyle)preferredStatusBarStyle { return [self.topViewController preferredStatusBarStyle]; } @end
我使用了你提到的第一种方法,我也发现当你使用UINavigationController
时候有点儿bug,它永远不会将preferredStatusBarStyle
调用传递给它的子视图控制器。 我所做的是UINavigationController
,并重写preferredStatusBarStyle
方法,如下所示:
@implementation GLBaseNavigationController - (UIStatusBarStyle)preferredStatusBarStyle { UIViewController *lastViewController = [self.viewControllers lastObject]; if ([lastViewController respondsToSelector:@selector(preferredStatusBarStyle)]) { return [lastViewController preferredStatusBarStyle]; } else if ([super respondsToSelector:@selector(preferredStatusBarStyle)]) { return [super preferredStatusBarStyle]; } return UIStatusBarStyleDefault; }
然后,无论何时我需要一个导航控制器,我使用GLBaseNavigationController
而不是UINavigationController
。 对于故事板,您还需要为您的子类指定导航控制器的类。
对于你的第一个解决scheme,我不认为你可以在viewDidLoad中更改状态栏。 如果你有两个ViewController堆叠在一起,每个ViewController都以不同的方式切换状态栏,那么这个方法只会被调用一次。 你真的想在viewWillAppear
更改状态栏,这样每次页面显示时都会调用它。 我也不认为你可以依靠preferredStatusBarStyle
因为我也不知道多久/什么时候被调用。 这是你想要做到的:
- (void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController.navigationBar setBarStyle:UIBarStyleDefault]; }
目前你只能做光明和黑暗。 要改变光明做。
-
在
.plist
文件中将UIViewControllerBasedStatusBarAppearance
设置为YES
。 -
在
viewDidLoad
方法中做[self setNeedsStatusBarAppearanceUpdate];
-
添加这个方法:
-(UIStatusBarStyle)preferredStatusBarStyle{ return UIStatusBarStyleLightContent; }
要将其更改为黑暗,请将UIStatusBarStyleLightContent
更改为UIStatusBarStyleDefault
在你的AppDelegate didFinishLaunch方法中,设置默认的状态栏风格,说:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES]; return YES; }
然后,在你想要改变状态栏的那两个视图控制器中,覆盖下面的方法:
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated] // Here change status bar color [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear] // Here bring back to color, that we set in AppDelegate [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES]; }