У меня есть навигационное приложение, в котором пользователь может скрыть строку состояния.Это запоминается в настройках по умолчанию.
В основном это работает, с одним исключением, что если приложение загружено (с нуля, не возвращено после возврата на домашний экран), когда строка состояния должна быть видимой, когда она переключается на невидимую, панель навигации не перемещается вверх, чтобы заполнить экран.Переключение параметра после этого перемещает панель навигации вверх и вниз правильно, но все еще с дополнительным промежутком размера строки состояния между панелью навигации и верхней частью экрана или строкой состояния.Если я вернусь на домашний экран и снова войду в приложение, это исправит себя.Поэтому я предполагаю, что какой-то метод вызывается на контроллере uinavigation по возвращении в приложение, которое мне нужно вызвать после переключения строки состояния?
Я попробовал (я думаю) все комбинации свойства wantfullscreenlayout, я устанавливал его в методе ниже, но это не имело никакого значения, поэтому я в итоге установил его (на навигационном контроллере) в NO в nib,
Вот код, который переключает строку состояния.Это в моем делегате приложения, у которого навигационный контроллер и окно настроены как выходы согласно шаблонному приложению.
if ([UIApplication sharedApplication].statusBarHidden != hideStatusBar)
{
[[UIApplication sharedApplication] setStatusBarHidden:hideStatusBar withAnimation:UIStatusBarAnimationSlide];
[UIView animateWithDuration:0.25 animations:^{
window.frame = [[UIScreen mainScreen] applicationFrame];
}];
}
else
{
window.frame = [[UIScreen mainScreen] applicationFrame];
}
Спасибо за вашу помощь.
ОБНОВЛЕНИЕ
Кажется, через NSLogging, что проблема лежит в рамке UINavigationBar.Поэтому я добавил следующий код, который работает и оживляет, но я не доволен!Я не чувствую, что это может быть «правильным» способом сделать это.В большинстве случаев дополнительный код ничего не делает, так как фрейм уже имеет значение (0,0), но в одной ситуации, где он некорректен, это дает правильный результат.
[navigationController.view setNeedsLayout];
CGRect navBarFrame;
UINavigationBar *navBar = nil;
for (UIView *subView in navigationController.view.subviews)
{
if ([subView isMemberOfClass:[UINavigationBar class]])
{
navBar = (UINavigationBar *)subView;
navBarFrame = navBar.frame;
navBarFrame.origin = CGPointMake(0,0);
break;
}
}
if ([UIApplication sharedApplication].statusBarHidden != hideStatusBar)
{
[[UIApplication sharedApplication] setStatusBarHidden:hideStatusBar withAnimation:UIStatusBarAnimationSlide];
[UIView animateWithDuration:0.25 animations:^{
window.frame = [[UIScreen mainScreen] applicationFrame];
navBar.frame = navBarFrame;
}];
}
else
{
window.frame = [[UIScreen mainScreen] applicationFrame];
}