Скрытие UIStatusBar / Перемещение UINavigationBar - PullRequest
3 голосов
/ 29 июля 2011

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

В основном это работает, с одним исключением, что если приложение загружено (с нуля, не возвращено после возврата на домашний экран), когда строка состояния должна быть видимой, когда она переключается на невидимую, панель навигации не перемещается вверх, чтобы заполнить экран.Переключение параметра после этого перемещает панель навигации вверх и вниз правильно, но все еще с дополнительным промежутком размера строки состояния между панелью навигации и верхней частью экрана или строкой состояния.Если я вернусь на домашний экран и снова войду в приложение, это исправит себя.Поэтому я предполагаю, что какой-то метод вызывается на контроллере 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];
}

Ответы [ 4 ]

1 голос
/ 29 июля 2011

Окно всегда скрывает строку состояния, поэтому не следует пытаться изменить ее размер.

Вместо этого измените размер представления корневого контроллера вашего окна на [[UIScreen mainScreen] applicationFrame].

1 голос
/ 11 августа 2011

проблема лежит в рамке 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];
}
0 голосов
/ 18 декабря 2012

Это то, что решил для меня

Просто представление:

[self.view setFrame: [self.view bounds]];

Вид с прокруткой внутри

[self.view setFrame: [self.view bounds]];
[self.theScroller setFrame: [self.view bounds]];

"theScroller - это имя моего прокрутки

0 голосов
/ 29 июля 2011

Насколько я знаю, если вы скрываете строку состояния, ваши представления автоматически занимают новое пространство, и вам не нужно менять рамку окна вручную. Что произойдет, если вы попробуете только это

if ([UIApplication sharedApplication].statusBarHidden != hideStatusBar)
{
    [[UIApplication sharedApplication] setStatusBarHidden:hideStatusBar withAnimation:UIStatusBarAnimationSlide];
}
...