Панель навигации появляется над представлениями с новым iOS7 SDK

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)значение y для iOS 7?

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

В viewDidLayoutSubviews я печатаю границы представления:

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

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

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

Кто-нибудь еще сталкивался с этой проблемой?

ОБНОВИТЬ:

Я нашел решение этой конкретной проблемы. Установите для свойства полупрозрачности панели навигации значение NO:

self.navigationController.navigationBar.translucent = NO;

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

Однако я не нашел исправления для случая, когда вы хотите, чтобы панель навигации была полупрозрачной. Например, просматривая фотографию в полноэкранном режиме, я хочу, чтобы панель навигации была полупрозрачной, а вид располагался под ней. Это работает, но когда я переключаю отображение / скрытие панели навигации, я получаю еще более странные результаты. Границы первого подвида (a UIScrollView) меняются каждый раз.


источник
4
Бета-версия программного обеспечения. Форумы разработчиков Apple более подходят. Кроме того, проблема явно упоминается в руководстве по переходу.
Sulthan

Ответы:

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
Именно поэтому здесь не следует задавать такой вопрос или отвечать на него.
Sulthan
Я не понимаю, почему, если вы хотите сохранить совместимость с ios6, вы вынуждены вводить условный регистр с помощью кода, чтобы проверить, есть ли у контроллера это свойство или нет ..
jerrygdm
12
Это работает, только если представление встроено в UINavigationController.
pojo
37

Скриншот из раскадровки

Если вы работаете в Storyboard (что я настоятельно рекомендую!), Вот решение: вы можете отключить «Extend Edges» вашего ViewController в раскадровке. Вы должны сделать это для каждого viewController. Вы можете отключить расширенные края, щелкнув значок viewController на панели инструментов (помимо productOwner под самим представлением), а затем выбрав инспектор атрибутов (как показано на изображениях).

Это также установит линии выравнивания, как в iOS 6.

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

Это просто здорово: D

[Обновить]

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

[self.navigationController.view setBackgroundColor:[UIColor whiteColor]];
MQoder
источник
Да, это решение, подходящее для этого с точки зрения раскадровки. Спасибо.
jpittman
12

Как сказано в OP, есть простое решение - сделать панель навигации непрозрачной. Вместо того, чтобы делать это в коде, просто снимите галочку с "Translucent" для корневой панели навигации:

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

Инфо
источник
8

self.edgesForExtendedLayout=UIRectEdgeNone;

Работает на симуляторе iOS 7 (Xcode 5 DP5)

Yhlin
источник
2
это отлично работает в ios7, но если я запустил приложение на ios 6 и ранее, представления снова перемещаются вверх. Любое решение для этого ?. Также нам нужно установить это свойство в каждом методе загрузки viewdid контроллера представления?
loganathan 05
вы всегда можете проверить, является ли текущая 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 # application: didFinishLaunchingWithOptions:

self.window.backgroundColor = [UIColor whiteColor];

В противном случае цвет фона панели навигации изменится на серый. Потому что прозрачная панель навигации перекрывает окно.

EIMEI
источник
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 Preview, поскольку они являются бета-версиями.

Джайпракаш Дубей
источник