Як запобігти охопленню 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.