it-swarm.com.ru

Как запретить UINavigationBar закрывать верхнюю часть обзора в iOS 7?

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

All ContentAll Content on Idle

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

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

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

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

Solution Attempt

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

96
Sam D20

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

self.navigationController.navigationBar.translucent = NO;

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

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

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

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

225
Deepesh

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

self.navController.navigationBar.translucent = NO;
30
Sumit Mundra

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

 enter image description here

21
Achyut Sagar

Это работает и для Swift на iOS 8.1

navigationController?.navigationBar.translucent = false
11
uplearnedu.com

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

[self.view sendSubviewToBack:self.tableView]

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


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

8
jbouaziz

Swift 4 :

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

self.navigationController?.navigationBar.isTranslucent = false
4
Md. Najmul Hasan

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

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

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

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

2
Krivoblotsky

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

Наличие полупрозрачной панели навигации не вызывает этой проблемы и не вызывает проблему, о которой вы писали в iOS 11+. Однако я не нашел обходного пути, чтобы он работал на всех платформах iOS, начиная с iOS 9.

0
Mr Jox