Как запретить 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.