setStatusBarHidden: НЕТ после загрузки XIB покрывает UINavigationBar - PullRequest
10 голосов
/ 08 марта 2011

Когда setStatusBarHidden:NO установлено до , когда представление загружается, UINavigationBar и другие элементы отображаются выровненными сразу под StatusBar, как и должно быть.Однако, когда setStatusBarHidden:NO установлен после , когда представление загружается, UINavigationBar частично покрывается.

StatusBar должен быть показан после загрузки указанного представления,но как это сделать, не сталкиваясь с вышеупомянутой проблемой?

Ответы [ 6 ]

16 голосов
/ 26 июля 2011

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

[self.navigationController setNavigationBarHidden:YES animated:NO];
[self.navigationController setNavigationBarHidden:NO animated:NO];

В моем коде функция выглядит так:

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

    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];

    [self.navigationController setNavigationBarHidden:YES animated:NO];
    [self.navigationController setNavigationBarHidden:NO animated:NO];
}

Однако, BE WARNED , это хак, и в настоящее время я борюсь с некоторыми ошибками, которые появляются из этого кода (элемент навигации не соответствует содержимому навигации ). Но поскольку в некоторых местах это сработало, я подумал, что упомяну это.

Изменить: Я думаю, что я нашел начальный пост здесь: Как получить панель навигации в UINavigationController для обновления его позиции, когда строка состояния скрыта?

GL, Одед

2 голосов
/ 29 марта 2012

(Я понимаю, что это старый вопрос, но я потратил полчаса, пытаясь найти ответ сам, но безуспешно, поэтому я решил опубликовать его здесь для всех, кто застрянет ... особенно, если вы пытаетесь ПОКАЗАТЬ строку состояния, и ваше представление в конечном итоге перекрывает ее)

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

[[UIApplication sharedApplication] setStatusBarHidden:YES];
[self.view setFrame: [[UIScreen mainScreen] bounds]];

но не тогда, когда вы хотите ПОКАЗАТЬ строку состояния ... в этом случае я использую это решение, которое работает, но беспокоит меня, потому что оно жестко кодирует высоту строки состояния до 20 ... меня также беспокоит, что я должен по-разному настраивать вид в зависимости от ориентации. но если я этого не делал, то всегда было 20 очков на неправильном краю. В моем случае я хочу отключить строку состояния для некоторых представлений, а затем снова включить, когда я вернусь. У меня были особые проблемы, если я поворачивал устройство, когда бар был выключен. так что выражение switch, хотя и некрасиво (кто-то может опубликовать более чистое решение), работает.

[[UIApplication sharedApplication] setStatusBarHidden:NO];

CGRect frame = [[UIScreen mainScreen] bounds];

switch (self.interfaceOrientation) 
{
    case UIInterfaceOrientationPortrait:
        frame.origin.y = 20;
        frame.size.height -= 20;
        break;

    case UIInterfaceOrientationPortraitUpsideDown:
        frame.origin.y = 0;
        frame.size.height -= 20;
        break;

    case UIInterfaceOrientationLandscapeLeft:
        frame.origin.x = 20;
        frame.size.width -= 20;
        break;

    case UIInterfaceOrientationLandscapeRight:
        frame.origin.x = 0;
        frame.size.width -= 20;
        break;

} 

[self.view setFrame:frame];
1 голос
/ 08 января 2013

Если у вас возникла эта проблема, потому что вы не отображаете строку состояния во время загрузки Default.png, а затем хотите отобразить строку состояния сразу после просмотра вашего первого View Controller, просто убедитесь, что вы поставили [[UIApplication sharedApplication] setStatusBarHidden:NO]; перед [self.window makeKeyAndVisible]; в вашем AppDelegate.m. Это происходит так быстро, что вы никогда не увидите строку состояния на заставке.

[[UIApplication sharedApplication] setStatusBarHidden:NO];
[self.window makeKeyAndVisible];
1 голос
/ 07 июля 2011

Я предполагаю, что навигационная панель загружается до отображения строки состояния, поэтому позиция навигационной панели равна (0,0), которая затем пересекается со строкой состояния в (0,0). Вы можете просто переместить кадр панели навигации (или настроить блок анимации) в viewDidLoad после вызова setStatusBarHidden:NO. Попробуйте сделать navigationBar.frame = CGRectMake(0,20,320,44); Строка состояния имеет размер 320x20, поэтому для этого достаточно просто переместить ее вниз на 20.

0 голосов
/ 10 января 2014

в iOS 7 вы можете использовать:

setNeedsStatusBarAppearanceUpdate

например:

[self.mainViewController.navigationController setNeedsStatusBarAppearanceUpdate];

apple docs:

Вызовите этот метод, если контроллер представленияатрибуты строки состояния, такие как скрытый / скрытый статус или стиль, изменяются.Если этот метод вызывается внутри блока анимации, изменения анимируются вместе с остальной частью блока анимации.

используйте его только для iOS 7.

0 голосов
/ 31 января 2012

Вот что я делаю в своем корневом контроллере сейчас в iOS 5 после того, как я говорю строке состояния для анимации. Ужасно, но, похоже, работает.

...