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

99

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

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

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

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

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

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

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

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

Сэм D20
источник
Вот еще одно решение этой проблемы. 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

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

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

Ачют Сагар
источник
12

Это работает и на iOS 8.1.

navigationController?.navigationBar.translucent = false
uplearnedu.com
источник
8

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

[self.view sendSubviewToBack:self.tableView]

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


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

Jbouaziz
источник
Это должен быть правильный ответ. Если вы добавляете подпредставление программно, вы можете просто сделать это [self.view insertSubview:self.tableView atIndex:0];вместо того, чтобы отправлять его на задний план после добавления.
smitt04
Верный. Но не зная, как он запускает свой контроллер (программно, построитель интерфейса), мы не можем предположить, что это лучшее решение. Хотя я свой ответ отредактировал.
jbouaziz 01
Это работает, но похоже на взлом. Есть ли уведомление об этом в официальной документации?
Джон Трэсид,
4

Swift 4 :

Установите следующую строку кода в методе viewDidLoad:

self.navigationController?.navigationBar.isTranslucent = false
Md. Наджмул Хасан
источник
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