Як запобігти охопленню UINavigationBar в iOS 7?


99

Після оновлення до Xcode 5 навігаційні панелі у всіх видах мого додатка змістилися вниз. Ось кілька скріншотів. Перший показує все на зображенні, коли він зруйнований, а другий показує, що все це недоторкано. Панель пошуку повинна починатися там, де знаходиться панель навігації.

Весь вміст Весь вміст у режимі очікування

Хтось знає, як я можу це виправити?

редагувати: я спробував цю попередню рекомендацію:

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

Але це дає дуже дивні результати.

Спроба рішення

Це може бути тому, що у мене під цим контролером перегляду є "слайд-меню", яке з'являється через прозорість навігаційної панелі.


Ось вам ще одне рішення цього питання. stackoverflow.com/a/51491645/10148333
— Afonso

Відповіді:


235

Встановіть для напівпрозорого властивості навігаційної панелі значення НІ :

self.navigationController.navigationBar.translucent = NO;

Це дозволить уникнути обрамлення пода під панеллю навігації та рядком стану.

Якщо вам потрібно показати та приховати панель навігації, тоді використовуйте

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

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


1
Я помістив це під, viewDidLoadоднак це не призводить до змін.
— Сем Д20

13
зробіть це viewDidLayoutSubviews functions
— індуїст

1
Додавши це до viewDidLayoutSubviews зробив свою справу. Я ціную допомогу, панове!
— Сем D20

Привіт, будь-яке питання? чи це комплімент?
— Індуїст

1
self.edgesForExtendedLayout = UIRectEdgeNone; допомогли мені
— пощастило

32

В iOS 7 налаштуваннях за замовчуванням все значення просвічуваного властивості контролера - ТАК, тому для цієї проблеми ви встановлюєте напівпрозору властивість "НІ" .

self.navController.navigationBar.translucent = NO;

2
Немає властивості "navController". Використовуйте це: self.navigationController.navigationBar.translucent = НІ;
— Джин З. Раган

я створюю об’єкт навігаціїконтролера в делеґаті програми та даю ім'я navController.
— Суміт Мундра

21

Ви можете відключити "Розширити краї" в інспекторі атрибутів контролера перегляду цього екрану (як показано на зображенні нижче):

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


12

Це працює як для швидкого, так і для iOS 8.1

navigationController?.navigationBar.translucent = false

8

Якщо ви бажаєте зберегти прозорість на своєму 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];


Це має бути правильна відповідь. Якщо ви додаєте субпрограму програмно, ви можете просто [self.view insertSubview:self.tableView atIndex:0];замість того, щоб відправляти його на зворотній бік після додавання.
— smitt04

Правильно. Але не знаючи, як він ініціює свій контролер (програмно, конструктор інтерфейсів), ми не можемо припустити, що це найкраще рішення. Хоча я відредагував свою відповідь.
— jbouaziz

Це працює, але схоже на злом. Чи є якесь повідомлення в офіційній документації про це?
— Джон Тракід


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
Я не думаю, що це взагалі вплине на погляд.
— Енріко Сусатьо,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.