iOS 7:模态视图控制器状态栏颜色错误但普通视图控制器正确

时间:2013-12-16 19:29:53

标签: ios7 uinavigationbar statusbar

我在iOS7中遇到一个问题,普通的UINavigationController推送视图控制器具有UINavigationController导航栏颜色的正确状态栏文本颜色(浅灰色,几乎是白色,因此状态栏文本为黑色)。但是,当使用-presentViewController:animated:completion:呈现“模态”视图控制器时,状态栏文本颜色将更改为白色,并且在给定导航栏颜色的情况下很难看到。 Navbar颜色在整个应用程序中始终相同,并且不会针对每个视图控制器进行更改。每次-presentViewController来电都会发生这种情况。

“查看基于控制器的状态栏外观”设置为YES。

我不知道该尝试解决这个问题。

9 个答案:

答案 0 :(得分:14)

将YourModalViewControler.modalPresentationCapturesStatusBarAppearance设置为YES,并将“查看基于控制器的状态栏外观”保持为YES。

- (void)viewDidLoad {
    [super viewDidLoad];
    self.modalPresentationCapturesStatusBarAppearance = YES;
    ....
}

然后覆盖preferredStatusBarStyle

- (UIStatusBarStyle)preferredStatusBarStyle {
    return TheStyleYouWant;
}

答案 1 :(得分:13)

导航控制器根据导航栏的barStyle属性决定是否拥有浅色或深色内容。默认值UIBarStyleDefault表示导航栏颜色浅,状态栏颜色较暗。将此属性更改为UIBarStyleBlack实际上并不会使导航栏变为黑色(导航栏的颜色仍然使用barTintColor设置),但它会告诉它它具有深色。然后导航控制器决定,由于导航栏很暗,它应该将状态栏内容设置为亮。

看来,在您的主导航控制器上(推送内容),barStyle确实设置为某处UIBarStyleBlack。您必须对模态显示的导航控制器执行相同的操作,如下所示:

UINavigationController *newViewController = [[UINavigationController alloc] initWithRootViewController:modalViewController];
newViewController.navigationBar.barStyle = self.navigationController.navigationBar.barStyle;
[self presentViewController:newViewController animated:YES completion:nil];

答案 2 :(得分:2)

您可以在导航控制器类

中重新定义preferredStatusBarStyle方法
- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
// or UIStatusBarStyleBlackOpaque, UIStatusBarStyleBlackTranslucent, or UIStatusBarStyleDefault

}

您还可以定义“view does load method”来设置您想要的自定义颜色

- (void) viewDidLoad
{
    UIColor *barColor = [UIColor whitecolor];

    UIView *colorView = [[UIView alloc] initWithFrame:CGRectMake(0.f, -20.f, 320.f, 64.f)];
    colorView.opaque = NO;
    colorView.alpha = .5f;
    colorView.backgroundColor = barColor;

    self.navigationBar.barTintColor = barColor;
    self.navigationBar.tintColor = [UIColor whiteColor];
    [self.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}];

    /*self.navigationController.navigationBar.barTintColor = [UIColor blackColor];
     self.navigationController.navigationBar.tintColor = [UIColor whiteColor];
     [self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor whiteColor]}];
     self.navigationController.navigationBar.translucent = NO;*/

    [self.navigationBar.layer insertSublayer:colorView.layer atIndex:0];

}

答案 3 :(得分:2)

这很有效。但我对此并不满意,因为它有点hacky。我认为这是一个错误,preferredStatusBarStyle没有调用模态视图。请问Apple。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    [self setNeedsStatusBarAppearanceUpdate];
}


- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
    [self setNeedsStatusBarAppearanceUpdate];
}

答案 4 :(得分:2)

我只是想出了如何做到这一点。我有完全相同的问题,它看起来像一个魅力!

您需要做的第一件事是将项目的.plist文件中的属性更改为NO。该属性为:“查看基于控制器的状态栏外观”。如果该属性不存在,请毫不犹豫地添加一个与我刚刚写给你的新属性(没有引号)。

第二件事是添加到每个视图控制器的viewDidLoad方法

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

如果您希望状态栏的文本为白色或

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];

如果您希望状态栏的文字为黑色。

这就是全部!

答案 5 :(得分:2)

NO

中将info.plist设为 var output = '/var/www/site/Brand new document.docx'.replace(/ /g, ""); or var output = '/var/www/site/Brand new document.docx'.replace(/ /gi,"");

答案 6 :(得分:1)

我遇到了和你一样的问题。 info.plist是正确的,并且其他地方的preferredStatusBarStyle被正确调用。但不是在我的模态视图中。这是因为preferredStatusBarStyle被发送到导航控制器。所以我创建了一个UINavigationController的子类,它将preferredStatusBarStyle传递给它所呈现的视图控制器,瞧,所有这些都表现得像它应该再次

答案 7 :(得分:0)

在回顾了这里和其他答案中提供的所有答案之后,我发现唯一对我有用的解决方案是为我以模态方式呈现的视图控制器创建一个空的导航栏。 / p>

这可能对您不起作用,但由于以下原因,它对我有用:

  1. 我的模态对话框还有导航栏(虽然它不用于导航;它只是用来保存或取消结果。
  2. 如上所述,状态栏颜色已在applicationDidFinishLaunching的应用范围内定义,并且具有自定义颜色。
  3. 从工程角度来看,让导航控制器有效地做任何事都有点烦人,但没有一个我无法解决这个问题。

答案 8 :(得分:0)

我的解决方案:

newViewController.modalPresentationStyle = .fullScreen

默认情况下,UINavigationController决定状态栏样式并覆盖所有子视图控制器样式。但是,当模态视图控制器是全屏时,会调用其方法preferredStatusBarStyle