Как запретить UINavigationBar закрывать вид сверху в iOS 7?


99

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

Все материалы Все содержимое в режиме ожидания

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

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

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

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

Попытка решения

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


Вот еще одно решение этой проблемы. stackoverflow.com/a/51491645/10148333
— Афонсо

Ответы:


235

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

self.navigationController.navigationBar.translucent = NO;

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

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

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

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


1
Я поместил это ниже, viewDidLoadно изменений не произошло.
— Sam D20

13
сделать это в viewDidLayoutSubviews funtions
— Hindu

1
Добавление этого к viewDidLayoutSubviews помогло. Благодарю за помощь господа!
— Sam D20

Привет, есть вопросы? или это комплимент?
— Hindu

1
self.edgesForExtendedLayout = UIRectEdgeNone; помог мне
— luky

32

По iOS 7умолчанию для всех полупрозрачных свойств контроллера установлено значение ДА, поэтому для этой проблемы вы устанавливаете полупрозрачное свойство как НЕТ .

self.navController.navigationBar.translucent = NO;

2
Нет свойства "navController". Используйте это: self.navigationController.navigationBar.translucent = NO;
— Gene Z. Ragan

Я создаю объект navigtionbarcontroller в делегате приложения и даю имя navController.
— Sumit Mundra

21

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

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



8

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

[self.view sendSubviewToBack:self.tableView]

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


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


Это должен быть правильный ответ. Если вы добавляете подпредставление программно, вы можете просто сделать это [self.view insertSubview:self.tableView atIndex:0];вместо того, чтобы отправлять его на задний план после добавления.
— smitt04

Верный. Но не зная, как он запускает свой контроллер (программно, построитель интерфейса), мы не можем предположить, что это лучшее решение. Хотя я свой ответ отредактировал.
— jbouaziz 01

Это работает, но похоже на взлом. Есть ли уведомление об этом в официальной документации?
— Джон Трэсид,


3

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

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

2

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

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


-1

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


-4

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

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

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


1
Я не думаю, что это вообще повлияет на вид.
— Enrico Susatyo
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.