2013-09-29 3 views
18

У меня есть приложение, которое было разработано в iOS 6. Но теперь в iOS 7 или даже моем приложении, скомпилированном для iOS 6, но запущенном на устройстве iOS 7 верхняя панель навигации (новая гигантская в iOS 7) мой контент скрыт. Верхняя панель навигации закрывает его. Если я вручную переместил его с помощью CGRect, он выглядит хорошо в iOS 7, но теперь iOS 6 выглядит ужасно (на много места над ним).iOS 7 Navigation Bar Скрытие содержимого

Приложение было создано с автоматическим отключением, так как автозапуск является способом для правильной настройки.

Мой вопрос в том, есть ли простой способ перемещения содержимого вниз для iOS 7? Я действительно не хочу, чтобы снова включить автозапуск и потратить месяц, пытаясь вернуть все элементы интерфейса. Приложение довольно сложное с 30 + экранами и множеством анимационных представлений на экранах.

+0

вам не нужно autolayout, чтобы исправить это, пожалуйста, прочтите [IOS 7 UI Руководство по переходу] (https://developer.apple.com/library/ios/documentation/userexperience/conceptual /TransitionGuide/AppearanceCustomization.html) – HepaKKes

ответ

28

Я думаю, что есть еще немного неправильного представления об этой проблеме макета, даже если iOS 7 был выпущен более года назад. Поэтому я в конечном итоге решил продолжить дальнейший ответ.

Вот что.

Поскольку значение automaticallyAdjustsScrollViewInsets 'по умолчанию YES, довольно простое решение может быть добавить следующий код:

if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) { // if iOS 7 
    self.edgesForExtendedLayout = UIRectEdgeNone; //layout adjustements 
} 

-viewDidLoad в методе ViewController в.

Если вы хотите удалить строку состояния (из-за полупрозрачности бара, так что это не странно), добавьте self.navigationController.navigationBar.translucent = NO. Значение по умолчанию: YES. Примечание: это не имеет никакого отношения к контенту, это связано с содержанием из-за прозрачности, но это совсем другая история!

Поскольку extendedLayoutIncludesOpaqueBars является NO по умолчанию self.navigationController.navigationBar.translucent = NO означает, в основном, имеющие

self.edgesForExtendedLayout = UIRectEdgeLeft | UIRectEdgeRight| UIRectEdgeBottom; 

Или, в более общем плане, что-то подобное (это как псевдокод, чтобы дать представление ...)

BOOL enableTopEdge = extendedLayoutIncludesOpaqueBars && !navigationBarIsTranslucent 
self.edgesForExtendedLayout = (enableTopEdge & UIRectEdgeTop) | UIRectEdgeLeft | UIRectEdgeRight | UIRectEdgeBottom; 
+0

Почему я получаю «Использование незаявленного идентификатора« UIRectEdgeNone », когда я использую его с последней версией xcode? Никто другой, кажется, не упоминает эту проблему, когда я вижу этот ответ. – James

+0

@James, потому что у вас нет iOS 7 SDK. Вам нужно обновить XCode для разработки для iOS 7. – Pwner

+0

@Pwner Я обновил его, хотя. Вот почему я так смущен. Я загрузил и установил его ранее в тот же день. И он был настроен на использование IOS7 в качестве базового SDK. – James

10

Вы также можете попробовать установить navigationBar.translucent = NO, как указано в this answer.

+1

@HepaKKes Я не понимаю нисходящее. Если вы установите прозрачность на нет и на экране контроллера раскладки разверните «Расширить края под непрозрачными барами», это правильный ответ. См .: http://stackoverflow.com/a/18775241/953105 – paulrehkugler

+0

Я по-прежнему компилирую SDK 6.1, и установка edgeForExtendedLayout не повлияла на меня, но настройка прозрачности на навигационной панели решила проблему. – arlomedia

+1

Работал для меня тоже – JohnQ

5

К скрыть навигационную панель, добавить в свой UIViewController следующее:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    // Hide the top navigation bar. 
    [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault]; 
    self.navigationController.navigationBar.shadowImage = [UIImage new]; 
    self.navigationController.navigationBar.translucent = YES; 
} 

Чтобы показать панель навигации, используйте следующее:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    // Show the top navigation bar. 
    self.navigationController.navigationBar.translucent = NO; 
} 

Ниже приведены результаты по iOS7:

Navigation bar is hidden. Navigation bar is shown.

скриншот слева находится с навигационной панели скрытый, а изображение справа - с отображаемой навигационной панелью - содержимое таблицы правильно скрыто под панелью навигации.

Надеюсь, это поможет!

+0

спасибо за код, я заметил, что вы не можете нажимать ни на что, так как навигационная панель технически невидима (но не удалена) – kevinl

0

Положить self.edgesForExtendedLayout = UIRectEdgeNone;

в методе ViewDidLoad