Навігаційна панель з’явиться над переглядами з новим SDK для iOS7


113
CGRect cgRect1 = [[UIScreen mainScreen] applicationFrame];


UISearchBar  *mySearchBar = [[UISearchBar alloc] 
               initWithFrame:CGRectMake(0, 0, cgRect.size.width, 40)];

mySearchBar.autoresizingMask = 
              UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight ;


UITableView  *myTableView = [[UITableView alloc] 
     initWithFrame:CGRectMake(0, 40, cgRect.size.width, cgRect.size.height-40)];

myTableView.autoresizingMask = 
               UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;


[self.view addSubview:mySearchBar];
[self.view addSubview:myTableView];

У попередніх версіях він працює коректно. Рядок пошуку відображається під statusbarпанеллю навігації та навігації. Показ tableviewвідображається під панеллю пошуку

Але коли я запускаю цю Xcode 5 sdk iOS 7панель, рядок пошуку не видно (я думаю, її розміщують під рядком стану та навігаційною панеллю), а також панель навігації з’являється над поданням таблиці.

Чи буде це виправлено iOS 7стабільним випуском?

Або це проблема мого кодування?

Або ми маємо це обробити, додавши (y = statubar height + nav bar height)значення у iOS 7?

Нещодавно я завантажив Xcode 5 DP, щоб перевірити свої програми в iOS 7. Перше, що я помітив і підтвердив, - це те, що межі мого перегляду не завжди змінюються для врахування рядка стану та панелі навігації.

У viewDidLayoutSubviews я друкую межі перегляду:

{{0, 0}, {320, 568}}

Це призводить до того, що мій вміст з’являється під навігаційною панеллю та рядком стану.

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

Хтось ще відчував це питання?

ОНОВЛЕННЯ:

Я знайшов рішення для цієї конкретної проблеми. Встановіть для напівпрозорого властивості панелі навігації значення НІ:

self.navigationController.navigationBar.translucent = NO;

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

Однак я не знайшов виправлення для випадку, коли потрібно, щоб панель навігації була напівпрозорою. Наприклад, переглядаючи фотографію на весь екран, я хочу, щоб панель навігації була напівпрозорою, а вигляд був обрамлений під нею. Це працює, але коли я перемикаю показ / приховування панелі навігації, я відчував ще більш незначні результати. Перший підвід (а UIScrollView) отримує свої межі y походження змінюється щоразу.


4
Бета-програмне забезпечення. Форуми розробників Apple є більш підходящими. Також проблема чітко згадується в путівнику з переходу.
Султан

Відповіді:


188

Це не зовсім вірно. У iOS 7 було введено нове властивість, яке дозволяє регулювати поведінку макета, як у попередніх версіях iOS. Помістіть цей фрагмент коду у контролер перегляду, і ви повинні бути готові! Простір, який займає ваша панель навігації, слід враховувати автоматично

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

Вам потрібно додати вищезазначене у своєму -(void)viewDidLoadметоді.

Примітка. Зараз ви повинні використовувати останню версію GM iOS 7 та Xcode 5, оскільки API змінився на бета-версії.


у моєму коді написано edgeForExtendedLayout. Використання незадекларованого ідентифікатора UIExtendedEdgeNone. Будь ласка, допоможіть.

6
Змінено на UIRectEdgeNone
Саймон

6
Саме це і є причиною, чому на таке питання тут не слід ставити або відповідати.
Султан

Я не відмовляюсь, чому, якщо ви хочете зберегти сумісність з ios6, ви змушені ввести умовний випадок за кодом, щоб перевірити, чи має цей контролер властивість чи ні ..
jerrygdm

12
Це, здається, спрацює лише в тому випадку, якщо представлення вбудоване в UINavigationController.
pojo

37

Знімок екрана з розкадрівки

Якщо ви працюєте в Storyboard (що я настійно рекомендую!), Це рішення: Ви можете вимкнути "Extend Edges" вашого ViewController у табло. Ви повинні зробити це для кожного представника перегляду. Ви можете відключити розширені краї, натиснувши значок viewController на ствердитборді (окрім productOwner під самим поданням), а потім виберіть інспектор атрибутів (як показано на зображеннях).

Це також встановить лінії вирівнювання, як iOS 6.

Ще один чудовий інструмент xCode 5 - «Попередній перегляд»: натисніть кнопку Butler (помічник редактора) та виберіть «Попередній перегляд». там ви можете вибрати iOS 6 і подивитися, як буде виглядати ваша конструкція рекламних плат на iOS 6.

Це просто чудово: D

[Оновлення]

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

[self.navigationController.view setBackgroundColor:[UIColor whiteColor]];

Так, це рішення приходить до нього з точки зору розкадровки. Дякую.
jpittman

12

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

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


8

self.edgesForExtendedLayout=UIRectEdgeNone;

Він працює на тренажері iOS 7 (Xcode 5 DP5)


2
це добре працює в ios7, але якщо я запустив додаток на ios 6 і раніше, перегляди перенесуться вгору. Будь-яке рішення для цього ?. Також нам потрібно встановити цю властивість у кожному методі навантаження viewdid контролера перегляду?
логатанат

Ви завжди можете перевірити, чи поточний iOS 7, якщо:if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
Aviel Gross

2

ці відповіді були корисними, особливо MQoder, але для мене я також повинен був встановити верхню панель за замовчуванням на "непрозору чорну навігацію".

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


1

@One Man Crew відповідь правильна, але:

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

 #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
     if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;
 #endif

0

self.edgesForExtendedLayout = UIRectEdgeNone;

І вам потрібно зробити це в додатку AppDelegate #: didFinishLaunchingWithOptions:

self.window.backgroundColor = [UIColor whiteColor];

Інакше колір фону навігаційної панелі зміниться на сірий. Оскільки прозора панель навігації перекривається вікном.


0

Якщо ви хочете зберегти прозорість, коли користувач прокручує подання вашої таблиці, ви можете встановити contentInset:

CGFloat topLayoutGuide = self.topLayoutGuide.length + self.tabBarController.navigationController.navigationBar.frame.size.height;
self.tableView.contentInset = UIEdgeInsetsMake(topLayoutGuide, 0, 0, 0);

-1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.