Как предотвратить UINavigationBar от покрытия верхней части окна в iOS 7?
После обновления до Xcode 5 навигационные панели во всех представлениях моего приложения сместились вниз. Вот несколько скриншотов, первый показывает все в представлении, когда он снесен, а второй показывает все это нетронутым. Строка поиска должна начинаться с панели навигации.
![All Content]()
![All 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/>
Надеюсь, что это поможет.