Как предотвратить UINavigationBar от покрытия верхней части окна в iOS 7?

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

All ContentAll Content on Idle

Кто-нибудь знает, как я могу это исправить?

edit: я пробовал эту ранее рекомендацию:

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;

Но это дает очень нечетные результаты.

Solution Attempt

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

Ответ 1

Задайте свойство прозрачности навигационной панели для NO:

self.navigationController.navigationBar.translucent = NO;

Это позволит зафиксировать представление под рамкой под панелью навигации и панель состояния.

Если вам нужно отобразить и скрыть панель навигации, используйте

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific

в вашем методе viewDidLoad.

Ответ 2

В iOS 7 по умолчанию все значение свойства полупрозрачного контроллера равно YES, поэтому для этой проблемы вы устанавливаете прозрачное свойство NO.

self.navController.navigationBar.translucent = NO;

Ответ 3

Вы можете отключить "Расширить края" в инспекторе атрибутов контроллера просмотра этого экрана (как показано на рисунке ниже)

введите описание изображения здесь

Ответ 4

Это работает также на iOS 8.1

navigationController?.navigationBar.translucent = false;

Ответ 5

Если вы хотите сохранить полупрозрачность на navigationBar, в конце вашего viewDidLoad или в viewWillAppear добавить эту строку кода:

[self.view sendSubviewToBack:self.tableView]

Как бы то ни было, если ваш подкласс scrollView (UITableView, UICollectionView и т.д.) находится в index 0 в вашем текущем виде subviews, он автоматически настраивает вставки в соответствии с вашим navigationBar. И это не должно влиять на ваш пользовательский интерфейс в версиях до iOS7.


ИЗМЕНИТЬ Если вы программно инициализируете свой UITableView, тогда лучше всего добавить его в представление, используя этот [self.view insertSubview:self.tableView atIndex:0];

Ответ 6

Вы можете добавить этот метод в свой контроллер просмотра, как показано на этом URL:

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.searchBar.frame = 
    CGRectMake(0, self.topOfViewOffset, self.searchBar.frame.size.width, self.searchBar.frame.size.height);
}

Ответ 7

Другим подходом является установка self.automaticallyAdjustsScrollViewInsets = YES; на вашем контроллере вида. Это включено по умолчанию. Но в вашем случае:

Я вижу, что вы используете EGORefreshHeaderView. Он играет с contentInset UITableView. Поэтому, когда вы отпустите его, заголовок будет reset верхняя вставка вместо восстановления предыдущего значения.

Ответ 8

Swift 4:

Задайте следующую строку кода в методе viewDidLoad:

self.navigationController?.navigationBar.isTranslucent = false

Ответ 9

Если вы хотите иметь полный контроль над представлениями и избегать ошибочных настроек iOS, подкласс UITableView и настраивать вставки (как прокрутки, так и индикаторы) в - (void) будет: MoveToWindow: (UIWindow *) newWindow. Работает для меня.

Ответ 10

Другой вариант - открыть файл Info.plist в режиме исходного кода и ввести следующую информацию:

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarHidden</key>
<true/>

Надеюсь, что это поможет.