IOS 7: строка состояния диспетчера модального отображения - неправильный цвет, но нормальные контроллеры просмотра верны

У меня проблема в iOS7, где обычный контроллер отображения UINavigationController имеет правильный цвет текста строки состояния для цвета навигационной панели UINavigationController (который светло-серый, почти белый, поэтому текст строки состояния черный). Однако, когда "модальный" контроллер представлений представлен с помощью -presentViewController:animated:completion:, цвет текста строки состояния изменяется на белый и очень трудно увидеть, учитывая цвет навигационной панели. Цвет Navbar всегда одинаковый для всего приложения и не изменяется для каждого контроллера вида. Это происходит при каждом вызове -presentViewController.

"Просмотр состояния панели управления на основе контроллера" установлен на YES.

Я не уверен, что посмотреть, чтобы попытаться решить эту проблему.

Ответы

Ответ 1

Контроллер навигации решает, иметь ли светлое или темное содержимое на основе его навигационной панели 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

установите для параметра MyModalViewControler.modalPresentationCapturesStatusBarAppearance значение YES и сохраните "Просмотр состояния панели управления на основе контроллера" на YES.

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

затем перезапишите preferredStatusBarStyle

- (UIStatusBarStyle)preferredStatusBarStyle {
    return TheStyleYouWant;
}

Ответ 3

Это работает. Но я не доволен этим, потому что это немного хаки. Я думаю, что это ошибка, которую 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

Я только что понял, как это сделать. У меня была такая же проблема, и кажется, что она работает как шарм!

Первое, что вам нужно сделать, это изменить атрибут в файле .plist вашего проекта на NO. Атрибут: "Просмотр состояния строки состояния на основе контроллера". Если атрибут не существует, не стесняйтесь добавлять новый текст точно так же, как я только что написал вам (без кавычек).

Во-вторых, нужно добавить к каждому виду viewDidLoad view view метод

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

если вы хотите, чтобы текст строки состояния был белым или

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];

если вы хотите, чтобы ваш текст строки состояния был черным.

Что все!

Ответ 5

Вы можете переопределить метод preferredStatusBarStyle в классе контроллера навигации

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
// or UIStatusBarStyleBlackOpaque, UIStatusBarStyleBlackTranslucent, or UIStatusBarStyleDefault

}

и вы также можете определить способ "view did load" для установки пользовательских цветов, которые вы хотите

- (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];

}

Ответ 6

установить UIViewControllerBasedStatusBarAppearance в NO в вашем info.plist

Ответ 7

У меня была та же проблема, что и у вас. Файл info.plist был правильным, и везде, где предпочтениевалось, статусStatusBarStyle был вызван правильно. Но не в моем модальном виде. Это связано с тем, что preferredStatusBarStyle был отправлен на контроллер навигации. Поэтому я создал подкласс UINavigationController, который передал на preferredStatusBarStyle контроллер представления, который он представлял, и voila, все вел себя так, как должно быть снова

Ответ 8

Проанализировав все ответы, представленные здесь и в других ответах, я обнаружил, что единственным решением, которое сработало для меня, было создать пустую панель навигации для контроллера представления, который я представляю модально.

Это может не сработать для вас, но оно работает для меня по следующим причинам:

  • В моем модальном диалоге есть панель навигации (хотя она не используется для навигации, она просто используется для сохранения или отклонения результатов).
  • Цвет строки состояния уже определен в обложке в applicationDidFinishLaunching, как обсуждалось выше, и имеет собственный цвет.

Это несколько раздражает с технической точки зрения, чтобы иметь контроллер навигации, который фактически ничего не делает, но без него я не смог преодолеть эту проблему.