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
, как обсуждалось выше, и имеет собственный цвет.
Это несколько раздражает с технической точки зрения, чтобы иметь контроллер навигации, который фактически ничего не делает, но без него я не смог преодолеть эту проблему.